python - "is"运算符对整数的行为异常

标签 python int operators identity python-internals

为什么以下在 Python 中会出现意外行为?

>>> a = 256
>>> b = 256
>>> a is b
True           # This is an expected result
>>> a = 257
>>> b = 257
>>> a is b
False          # What happened here? Why is this False?
>>> 257 is 257
True           # Yet the literal numbers compare properly

我正在使用 Python 2.5.2。尝试一些不同版本的 Python,似乎 Python 2.3.3 在 99 和 100 之间显示了上述行为。

基于以上内容,我可以假设 Python 的内部实现方式是“小”整数与大整数的存储方式不同,is 运算符可以区分它们。为什么泄漏抽象?当我事先不知道它们是否为数字时,比较两个任意对象以查看它们是否相同的更好方法是什么?

最佳答案

看看这个:

>>> a = 256
>>> b = 256
>>> id(a) == id(b)
True
>>> a = 257
>>> b = 257
>>> id(a) == id(b)
False

这是我在 "Plain Integer Objects" 的文档中找到的内容:

The current implementation keeps an array of integer objects for all integers between -5 and 256. When you create an int in that range you actually just get back a reference to the existing object.

因此,整数 256 是 identical ,但 257 个不是。这是一个 CPython 实现细节,不能保证其他 Python 实现。

关于python - "is"运算符对整数的行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55095140/

相关文章:

c# - 字符串和整数,隐式和显式

c - 为什么(double + int)的结果是0(C语言)

c# - 如何在数学对象等表达式中使用自定义类?

c++ - C++中是否有 "normal"一元逻辑运算符

python - 将时间段字符串转换为值/单位对

python - 苹果系统; Python3; FileNotFoundError : [Errno 2] No such file or directory: '' . 如何修复?

python:带有 BeautifulSoup 的 Google 搜索抓取工具

python - 在 python 中运行子进程时泄漏

java - 如何将用户输入添加到我的 Java 程序中以便在 if 语句中使用

matrix - 如何在实现中缀运算符时避免循环依赖