首页  >  文章  >  后端开发  >  为什么 Python 的“is”运算符对于不同代码块中的大整数表现不同?

为什么 Python 的“is”运算符对于不同代码块中的大整数表现不同?

Susan Sarandon
Susan Sarandon原创
2024-11-01 15:26:31328浏览

Why Does Python's

Python 对大整数的“is”运算符行为

问题

在 Python 中,is 运算符检查对象身份而不是等价性。但是,在某些情况下,此行为可能是意外的,如下所示:

<code class="python">def func():
    a = 1000
    b = 1000
    return a is b

a = 1000
b = 1000

print(a is b, func())  # (False, True)</code>

is 比较在函数内返回 True,但在函数外返回 False。尽管评估结果不同,整数 a 和 b 似乎具有相同的值。

解释

要理解这种行为,Python 解释器对代码块的解释至关重要。根据Python参考手册,交互执行的每个命令都构成一个单独的代码块。以下内容被视为块:

  • 模块
  • 函数体
  • 类定义

在单个代码块中,Python 缓存某些对象,例如小整数(在 [-5, 256] 范围内)。当多个变量引用相同的整数文字时,它们都将引用相同的缓存整数对象。但是,如果在不同的代码块中声明文字,则会创建不同的整数对象。

不同的代码对象,不同的标识

为了说明这一点,请考虑每种情况的代码对象:

  • 函数 func: a 和 b 引用同一个整数对象(由 Python 缓存,因为 1000 在缓存的整数范围内)。
  • 交互式命令: a 和 b 引用不同的整数对象,因为它们是在单独的代码块中定义的。

因此,a is b 在 func 块中计算为 True,其中所有整数都是缓存,并且在创建单独对象的块外为 False。

注意事项

请注意以下注意事项:

  • 在单行中链接赋值语句可能会导致在 True 身份检查中。
  • 由于模块的单个代码块,模块级执行将返回 True。
  • 涉及可变对象的测试将始终返回 False,因为它们没有被缓存。

结论

理解 Python 中代码块的概念对于解释涉及身份比较的意外行为至关重要。虽然对于检查不可变对象的身份很有用,但建议使用相等运算符(==)来比较值,因为它不依赖于缓存。

以上是为什么 Python 的“is”运算符对于不同代码块中的大整数表现不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn