为什么 (0-6) 是 -6 = False?[重复]

2025-03-10 08:52:00
admin
原创
57
摘要:问题描述:我在调试一些代码时发现了一些奇怪的东西。显然,>>> (0-6) is -6 False 但,>>> (0-5) is -5 True 为什么会发生这种情况?解决方案 1:所有从 -5 到 256 的整数(包括 -5 到 256)都被缓存为与 CPython 共享...

问题描述:

我在调试一些代码时发现了一些奇怪的东西。显然,

>>> (0-6) is -6
False

但,

>>> (0-5) is -5
True

为什么会发生这种情况?


解决方案 1:

所有从 -5 到 256 的整数(包括 -5 到 256)都被缓存为与 CPython 共享同一地址的全局对象,因此is测试通过。

该工件在http://www.laurentluce.com/posts/python-integer-objects-implementation/中有详细解释,我们可以在http://hg.python.org/cpython/file/tip/Objects/longobject.c中查看当前的源代码。

使用特定结构来引用小整数并共享它们,以便快速访问。它是一个包含 262 个指向整数对象的指针的数组。这些整数对象在初始化期间分配在我们上面看到的整数对象块中。小整数的范围是 -5 到 256。许多 Python 程序花费大量时间使用该范围内的整数,因此这是一个明智的决定。

这只是 CPython 的一个实现细节,您不应该依赖它。例如,PyPy实现了id整数的返回值以返回其自身,因此(0-6) is -6即使它们在内部是“不同的对象”,也始终为真;它还允许您配置是否启用此整数缓存,甚至设置下限和上限。但一般来说,从不同来源检索的对象不会相同。如果您想比较相等性,只需使用==

解决方案 2:

Python 在解释器中存储 -5 - 256 范围内的整数:它有一个整数对象池,这些整数从该池中返回。这就是为什么这些对象是相同的:(0-5)-5不是(0-6)和,-6因为它们是当场创建的。

这是CPython源代码中的来源:

#define NSMALLPOSINTS           257
#define NSMALLNEGINTS           5
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];

(查看 CPython 源代码:)/trunk/Objects/intobject.c。源代码包含以下注释:

/* References to small integers are saved in this array so that they
   can be shared.
   The integers that are saved are those in the range
   -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/

然后,运算符is会将它们 ( -5) 进行比较,因为它们是同一个对象(相同的内存位置),但另外两个新整数 ( -6) 将位于不同的内存位置(然后is不会返回True)。请注意,257上面的源代码中的 是针对正整数的,因此 是0 - 256(包括在内)。

(来源)

解决方案 3:

这不是一个错误。is不是一个平等测试。==将给出预期的结果。

这种行为的技术原因是 Python 实现可以自由地将相同常量值的不同实例视为相同对象或不同对象。您使用的 Python 实现选择让某些小常量共享同一个对象以节省内存。您不能指望这种行为在各个版本之间或不同的 Python 实现之间是相同的。

解决方案 4:

发生这种情况的原因是 CPython 缓存了一些小整数和小字符串,并赋予该对象的每个实例相同的id()

(0-5)-5的值相同,但对于和 来说id(),这并不成立0-6`-6`

>>> id((0-6))
12064324
>>> id((-6))
12064276
>>> id((0-5))
10022392
>>> id((-5))
10022392

对于字符串也类似:

>>> x = 'abc'
>>> y = 'abc'
>>> x is y
True
>>> x = 'a little big string'
>>> y = 'a little big string'
>>> x is y
False

有关字符串缓存的更多详细信息,请阅读:is比较字符串与空格时,运算符的行为有所不同

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3983  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2747  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   82  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   79  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用