gpt4 book ai didi

python - 'is' 运算符对 float 的表现出乎意料

转载 作者:太空狗 更新时间:2023-10-29 19:31:46 26 4
gpt4 key购买 nike

我在对模块进行单元测试时遇到了一个令人困惑的问题。该模块实际上正在转换值,我想比较这些值。

==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) 的内部表示应该相等。与 == 的比较按预期工作。

最佳答案

这与的工作方式有关。它检查引用而不是值。如果任一参数分配给同一个对象,它返回 True

在这种情况下,它们是不同的实例; float(0)float(0) 具有相同的值 ==,但就 Python 而言,它们是不同的实体。 CPython 实现还将整数缓存为该范围内的单例对象 -> [x | x ∈ ℤ ∧ -5 ≤ x ≤ 256 ]:

>>> 0.0 is 0.0
True
>>> float(0) is float(0) # Not the same reference, unique instances.
False

在这个例子中我们可以演示整数缓存原理:

>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

现在,如果将 float 传递给 float(),则只返回 float (短路),因为使用了相同的引用,因为无需从现有 float 实例化新 float :

>>> 0.0 is 0.0
True
>>> float(0.0) is float(0.0)
True

这可以通过使用 int() 进一步证明:

>>> int(256.0) is int(256.0)  # Same reference, cached.
True
>>> int(257.0) is int(257.0) # Different references are returned, not cached.
False
>>> 257 is 257 # Same reference.
True
>>> 257.0 is 257.0 # Same reference. As @Martijn Pieters pointed out.
True

但是,is 的结果也取决于它正在执行的范围(超出这个问题/解释的范围),请引用用户: <强>@ Jim 关于code objects的精彩解说.甚至 python 的文档也包含有关此行​​为的部分:

[7] Due to automatic garbage-collection, free lists, and the dynamic nature of descriptors, you may notice seemingly unusual behaviour in certain uses of the is operator, like those involving comparisons between instance methods, or constants. Check their documentation for more info.

关于python - 'is' 运算符对 float 的表现出乎意料,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38834770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com