在单元测试一个模块时,我遇到了一个令人困惑的问题。该模块实际上正在进行数值转换,而我想比较这些值。
使用==
和is
进行比较存在区别(在某种程度上,我知道它们之间的差异)。
>>> 0.0 is 0.0
True # as expected
>>> float(0.0) is 0.0
True # as expected
到目前为止,一切都如预期,但这里是我的“问题”:
>>> float(0) is 0.0
False
>>> float(0) is float(0)
False
为什么?至少最后一个对我来说真的很令人困惑。float(0)
和float(0.0)
的内部表示应该是相等的。使用==
进行比较正常工作。
id(0.0)
、id(float(0.0))
和id(float(0))
的值都相同。也就是说,如果我在交互式 shell 中依次执行它们,那么它们的值是相同的,但是如果我将它们作为元组执行id(float(0.0)), id(float(0))
,那么它们的 ID 就不同了。有什么解释吗? - tobias_k0.0是0.0
只产生一个被重用的对象),Python 重用内存(因此id(0.0)
后跟另一个id(someobject)
可能会产生相同的 id,因为之前的已被垃圾回收),而生成元组无法重用内存位置,因为您仍然需要所有对象都成为该元组的一部分。 - Martijn Pieters