问题仅当使用复数时与十进制数一起使用。浮点数、整数等按强制转换进行比较,工作正常。
在
Python3 的十进制库中,与复数比较是在
_convert_for_comparison 中处理的。
if equality_op and isinstance(other, _numbers.Complex) and other.imag == 0:
other = other.real
在Python2中,
convert 函数的实现方式是:
def _convert_other(other, raiseit=False, allow_float=False):
"""Convert other to Decimal.
Verifies that it's ok to use in an implicit construction.
If allow_float is true, allow conversion from float; this
is used in the comparison methods (__eq__ and friends).
"""
if isinstance(other, Decimal):
return other
if isinstance(other, (int, long)):
return Decimal(other)
if allow_float and isinstance(other, float):
return Decimal.from_float(other)
if raiseit:
raise TypeError("Unable to convert %s to Decimal" % other)
return NotImplemented
由于首先将
Decimal与int进行比较,因此
len(set([1, Decimal('1'), (1+0j)])) == 2
为真。如果更改顺序,则会得到不同的输出结果。
In [23]: {1, Decimal('1'), (1+0j)}
Out[23]: {(1+0j), Decimal('1')}
In [24]: {Decimal('1'),1, (1+0j)}
Out[24]: {(1+0j), Decimal('1')}
In [25]: {Decimal('1'), (1+0j), 1}
Out[25]: {1}
同时使用字面量更好,因为你插入的顺序与文档匹配,就像最后一个值是
preserved一样,使用字面量而不是set(..)。
one_decimal == one_complex
的结果为True
。 - Mad Physicistlen(set([Decimal('1'), (1+0j)]))
为2,但是len(set([1, Decimal('1'), (1+0j)]))
却为1。 - wim