python - 为什么 'is' 运算符在算术相等表达式中表现异常

标签 python python-3.x identity equality cpython

阅读后thisthis ,我仍然无法理解以下行为:

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 对象的名称)。

因此,在第二种情况下,从技术上讲,ab 都成为 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/

相关文章:

identity - OIM 的数据库查询

python - 将单个 python 可执行文件添加到多台计算机的 Windows 系统路径中?

python - 如何将背景颜色放在 vtktextactor 后面?

php - PHP中is_null "== NULL"和 "=== NULL"的区别

Python pandas从mysql获取最大值

python-3.x - 使用 TensorFlow 在 2D 中绘制梯度下降轨迹时的 Traceback

java - JPA 使用 GenerationType.IDENTITY @onetomany Postgres 子(多)表插入失败 : Not Null Constraint Error On Parent FK

python - Django 监听器听不到信号

python - 使用 matplotlib 制作 2D 像素图

python - 如何将文本放入输入行 : how to ask for user input on the command line while providing a 'default' answer that the user can edit or delete?