首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:'inf是inf',但是'-inf不是-inf'?

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

Stack Overflow用户
提问于 2020-07-15 18:47:45
回答 3查看 285关注 0票数 4

Python 3.7

在编写最大搜索代码时,我遇到了一个负无穷大的奇怪行为。有人能解释一下为什么会有这种行为吗?

代码语言:javascript
复制
>>> inf = float('inf')
>>> inf is inf
True
>>> (-inf) is (-inf)
False

我已经意识到用==进行比较比较更好,但我对上面问题的答案很感兴趣。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-15 18:52:09

inf是一个变量,绑定到特定的对象。任何对象都是is本身,所以inf is inf

-inf是一个表达式。它做数学,并产生一个值浮点负无穷大的对象.Python没有保证这个对象是否与具有该值的任何其他对象相同。在您的示例中,-inf的两个计算结果恰好产生了不同的对象。

再说一次,没有向承诺-inf is -inf将产生什么。当前的CPython实现碰巧不断地产生False。PyPy的原始处理生产真。不同的Python版本或实现可能不一致地根据当前内存压力生成真或假,或者您是否将其作为脚本运行,还是交互地运行,或者任何其他因素。CPython本身已经出现了在脚本中或交互中对象标识不同的情况;例如:

代码语言:javascript
复制
x = 1000
y = 1000
print(x is y)

根据是否以交互方式运行,在当前CPython实现中打印不同的内容。

票数 14
EN

Stack Overflow用户

发布于 2020-07-15 18:51:55

-inf是一个生成新float对象的操作,您可以在同一个表达式中使用它两次。产生了两个不同的对象,因为不需要Python实现就可以注意到两个子表达式都可以返回对同一个对象的引用。

票数 7
EN

Stack Overflow用户

发布于 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实现中:

代码语言:javascript
复制
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没有缓存,所以它将被创建两次。

试着把注意力放在价值观上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62921828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档