Python 如何在两个不同的内存位置创建int 1?

Python 如何在两个不同的内存位置创建int 1?,python,cpython,Python,Cpython,我想向某人展示如何使用is而不是=来比较整数可能会失败。我原以为这样行得通,但没有: >>> import copy >>> x = 1 >>> y = copy.deepcopy(x) >>> x is y True 对于更大的整数,我可以轻松做到这一点: >>> x = 500 >>> y = 500 >>> x is y False 我如何用较小的整数演示同样的

我想向某人展示如何使用
is
而不是
=
来比较整数可能会失败。我原以为这样行得通,但没有:

>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True
对于更大的整数,我可以轻松做到这一点:

>>> x = 500
>>> y = 500
>>> x is y
False
我如何用较小的整数演示同样的事情,这些整数在python中通常用于类似枚举的目的?

您可以:

>>> 0 - 6 is -6
False
>>> 0 - 6 == -6
True
它也适用于更大的数字:

>>> 1000 + 1 is 1001
False
>>> 1000 + 1 == 1001
True

这取决于您想要演示的内容,但上面突出了
is
=
之间功能上的差异,您所观察到的是预期的:

>>> x=256
>>> y=256
>>> x is y
True
>>> x=257
>>> y=257
>>> x is y
False
>>> x=-5
>>> y=-5
>>> x is y
True
>>> x=-6
>>> y=-6
>>> x is y
False
引述自:

当前实现为所有对象保留一个整数对象数组 在
-5
256
之间的整数,在该范围内创建整数时 实际上,只需返回对现有对象的引用。所以 应该可以更改
1
的值。我怀疑这种行为 在本例中,Python的名称未定义。:-)


以下示例在Python 2和Python 3中都失败:

>>> n=12345
>>> ((n**8)+1) % (n**4) is 1
False
>>> ((n**8)+1) % (n**4) == 1
True
原因略有不同。Python2使用
int
类型表示小整数,使用
long
类型表示任意精度值。只有
int
类型被插入,因此当返回
1L
时,示例失败


Python3只使用任意精度类型(并将其重命名为
int
)。该示例失败,因为余数计算在内部计算值1并返回它。只有在创建了对象并且该对象是在计算开始时创建的,且其值为1之前,才会进行内部检查。

您不能,介于-1和99之间的整数在cPythonDownload上被内联,将源代码下载到Python并修改代码以创建一个不内联的版本ints@PavelAnossov这是
-5
256
@DavidHeffernan:这很难向想要使用
is
的人证明它在实际的python安装中可能会失败。@Wooble的确如此。所以,如果你想让这样的整数不被拘留,你必须改变代码。我最初的评论是轻松地试图指出既定目标的无效性。我已经知道这一点。。我想我已经清楚地询问过0和1这样的INT,我能从实习生身上踢出1吗?@wim黑客来源?