Python 3.7
在编写最大搜索代码时,我遇到了一个负无穷大的奇怪行为。有人能解释一下为什么会有这种行为吗?
>>> inf = float('inf')
>>> inf is inf
True
>>> (-inf) is (-inf)
False我已经意识到用==进行比较比较更好,但我对上面问题的答案很感兴趣。
发布于 2020-07-15 18:52:09
inf是一个变量,绑定到特定的对象。任何对象都是is本身,所以inf is inf。
-inf是一个表达式。它做数学,并产生一个值浮点负无穷大的对象.Python没有保证这个对象是否与具有该值的任何其他对象相同。在您的示例中,-inf的两个计算结果恰好产生了不同的对象。
再说一次,没有向承诺-inf is -inf将产生什么。当前的CPython实现碰巧不断地产生False。PyPy的原始处理生产真。不同的Python版本或实现可能不一致地根据当前内存压力生成真或假,或者您是否将其作为脚本运行,还是交互地运行,或者任何其他因素。CPython本身已经出现了在脚本中或交互中对象标识不同的情况;例如:
x = 1000
y = 1000
print(x is y)根据是否以交互方式运行,在当前CPython实现中打印不同的内容。
发布于 2020-07-15 18:51:55
-inf是一个生成新float对象的操作,您可以在同一个表达式中使用它两次。产生了两个不同的对象,因为不需要Python实现就可以注意到两个子表达式都可以返回对同一个对象的引用。
发布于 2020-07-20 02:50:19
我想补充一点:在Python中,当我们使用id()函数、is操作符、==操作符等时,我们使用的真正目标是值,而不是变量。
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值,那么这样的事情同样简单:
由于缓存池,小int 1被缓存,str '10000'也被缓存,但是大int 10000没有缓存,所以它将被创建两次。
试着把注意力放在价值观上。
https://stackoverflow.com/questions/62921828
复制相似问题