[英]Python: 'inf is inf', but '-inf is not -inf'?
Python 3.7
在编写最大值的搜索代码时,我遇到了负无穷大的奇怪行为。 有人可以解释为什么这种行为吗?
>>> inf = float('inf')
>>> inf is inf
True
>>> (-inf) is (-inf)
False
而且我已经意识到使用==
进行比较会更好,但我对上述问题的答案很感兴趣。
inf
是一个变量,绑定到特定的 object。 任何 object is
它自己,所以inf is inf
。
-inf
是一个表达式。 它进行数学运算,并产生一个 object 值浮点负无穷大。 Python 不承诺这是否与具有该值的任何其他 object 相同。 在您的情况下, -inf
的两个评估碰巧产生了不同的对象。
同样,没有关于 -inf 是什么的承诺-inf is -inf
会产生什么。 当前的 CPython 实现恰好始终产生 False。 PyPy 的原始处理产生 True 。 不同的 Python 版本或实现可能会根据当前的 memory 压力,或者您是否将其作为脚本或交互方式或任何其他因素运行,不一致地产生 True 或 False。 CPython 本身已经存在 object 身份在脚本或交互方式中不同的情况; 例如,这个:
x = 1000
y = 1000
print(x is y)
根据您是否以交互方式运行它,在当前 CPython 实现中打印不同的内容。
-inf
是一个产生新float
object 的操作,您在同一个表达式中使用了两次。 产生两个不同的对象,因为 Python 实现不需要注意两个子表达式可以返回对相同 object 的引用。
我想补充一点:在 Python 中,当我们使用id()
function, is
operator, ==
operator 等时,我们使用的真正目标是value ,而不是variable 。
a is b
等于id(a) == id(b)
。
在您的代码中, inf = float('inf')
将产生一个名为inf
的值。
inf
也是一个表达式,它将被评估为一个值。
inf is inf
将是True
,因为实际上两个表达式的评估值是相同的。
在 Python 中,专注于价值观更好更容易。
例如,在 CPython 实现中:
a = 1
b = 1
a is b # will be true
a = 10000
b = 10000
a is b # will be false
a = '10000'
b = '10000'
a is b # will be true
如果我们专注于变量,这样的事情就很奇怪。 如果我们专注于值,如果我告诉你 CPython 实现有缓存池,它用于小 int 和一些文字 str 值,那么事情就很简单了:
因为缓存池的原因,small int 1
被缓存了,str '10000'
也被缓存了,而 big int 10000
没有被缓存,所以会被创建两次。
尝试专注于价值观。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.