【发布时间】:2021-05-25 00:23:06
【问题描述】:
a = 1000
b = 1000
print (a == b)
print (a is b)
print (f"id(a) = {id(a)} \nid(b) = {id(b)}")
正如所料,我得到了
True
True
id(a) = 2806705928816
id(b) = 2806705928816
但是当我尝试做这样的事情时:
a = 1000
b = 1000 + a - a
print (a == b)
print (a is b)
print (f"id(a) = {id(a)} \nid(b) = {id(b)}")
我在表达式a is b 中得到了False
True
False
id(a) = 3030783801968
id(b) = 3030783802064
为什么在将表达式的结果分配给整数和带有其他变量的表达式时,变量的行为会有所不同?尽管在数学上这给出了相同的整数。
【问题讨论】:
-
因为这两个 1000 是字面量。它们是在程序开始时定义的。只需要其中一个。
-
第二种情况,它们不是“同一个整数”;它们是具有相同值的不同整数对象。
-
究竟是什么意外?为什么你期望
a is b在这里是真的?在您的第一个示例中这是正确的事实应该令人惊讶 -
不要使用
is来检查算术相等性,这就是==的用途。is用于检查两个变量/名称是否引用同一个对象。 -
这完全是猜测,但我猜这只是编译器优化有多聪明的问题。大多数时候,您并不关心 Python 如何在后台分配变量内存,但在第一种情况下,它通过避免重复分配来尝试节省空间,这对您来说是透明的,如果您不是观看
id()值。但在第二种情况下,它不够聪明,所以你最终得到了 2 个分配。
标签: python python-3.x identity equality cpython