繁体   English   中英

Python:'inf 是 inf',但 '-inf 不是 -inf'?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM