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)}")
我得到了False
在表达式 a is b
中
True
False
id(a) = 3030783801968
id(b) = 3030783802064
为什么当将整数表达式的结果分配给变量和带有其他变量的表达式时,变量的行为会有所不同?尽管在数学上这给出了相同的整数。
最佳答案
当你做类似的事情时:
(案例1)
a = 1000
b = a
或(情况2)
a = 1000
b = 1000
Python 足够聪明,可以预先知道即使在执行后也不需要新的内存。
因此,在第一种情况下,Python 在执行之前使 b
成为 a
的别名。
第二种情况有点不同。
Python 是一种真正的面向对象语言,文字 1000
被视为一个对象。 (直观上你可以认为 1000 是 const 对象的名称)。
因此,在第二种情况下,从技术上讲,a
和 b
都成为 1000
的别名
现在在您的示例中:
a = 1000
b = 1000 + a - a
print (a == b)
print (a is b)
在分配b
时,Python事先并不知道a
的值是什么。当我说事先时,我的意思是在开始任何形式的计算之前。因此python为b
保留了一个新的内存位置,然后将操作的输出保存在这个新的内存位置中。
还值得注意的是:
4-1 is 3
True
在这种情况下,Python 不会将此行保存为 4-1
,而是在编译之前将其处理为 3
,以实现运行时优化。
关于python - 为什么 'is' 运算符在算术相等表达式中表现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66321133/