小能豆

为什么“a is b”在交互模式下的行为与从脚本运行时的行为不同?

py

在尝试回答有关关键字使用的问题时is,我发现此代码:

脚本:

a = 123456
b = 123456
print a is b # True

交互模式:

>>> a = 123456
>>> b = 123456
>>> a is b
False

在 Python 交互模式下以及从脚本运行时给出了不同的输出。

从这个答案:

当前实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个整数时,实际上只是返回对现有对象的引用。

因此,我期望仅对范围内的整数a is b返回。但这仅在交互模式下才成立,而不是从脚本运行时成立。True``[-5, 256]

问题:为什么a is b在交互模式下的行为与从脚本运行时的行为不同?


注意:在 Python 2.7 和 Python 3 中测试


阅读 8

收藏
2024-10-28

共1个答案

小能豆

您观察到的有关关键字和整数缓存的行为is是由于 Python 如何管理内存和对象创建,特别是在交互模式与运行脚本时。

整数缓存

Python 会缓存小整数(通常在 -5 到 256 的范围内)。这意味着当您在此范围内创建一个整数时,出于性能原因,Python 会重复使用同一个对象。这就是为什么在交互模式和脚本中,像这样的表达式a is b都会返回True此范围内的整数。

交互模式与脚本模式的区别

  1. 交互模式
  2. 当您在交互模式下输入表达式时,每个赋值都会创建一个引用相同缓存整数对象的新变量。因此,如果您执行a = 123456b = 123456,则a和都b引用内存中的同一个对象,这会导致a is b返回True第一种情况。但是,如果值超出了缓存范围,您最终可能会得到False,因为会为更大的整数创建新的对象。
  3. 脚本模式
  4. 在脚本模式下,解释器以不同的方式优化和管理对象生命周期。运行脚本时,执行上下文更加孤立。每个赋值(a = 123456b = 123456)最终可能会创建单独的整数对象,从而导致a is b返回,False因为ab引用不同的整数对象,即使它们具有相同的值。

结论

总之,行为的差异a is b不仅仅与整数缓存有关;它还受到 Python 在交互式和脚本执行上下文中管理对象引用的方式的影响。这可能导致创建不同的对象实例,尤其是对于缓存范围之外的整数。因此,当您想要检查两个值是否相等时,最好使用它,==而不管它们的对象身份如何

2024-10-28