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

时间:2014-01-30 12:17:05

标签: python cpython

我想向某人展示如何使用is代替==来比较整数可能会失败。我认为这会奏效,但事实并非如此:

>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True

我可以轻松地为更大的整数做到这一点:

>>> x = 500
>>> y = 500
>>> x is y
False

如何使用较小的整数来演示相同的东西,这些整数通常可用于python中类似于枚举的目的?

3 个答案:

答案 0 :(得分:2)

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

>>> n=12345
>>> ((n**8)+1) % (n**4) is 1
False
>>> ((n**8)+1) % (n**4) == 1
True

原因略有不同。 Python 2对小整数使用int类型,对任意精度值使用long类型。仅限int类型,因此在返回1L时示例失败。

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

答案 1 :(得分:1)

你可以这样做:

>>> 0 - 6 is -6
False
>>> 0 - 6 == -6
True

它也适用于更大的数字:

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

这取决于您要展示的内容,但上面突出显示了is==之间功能的差异。

答案 2 :(得分:1)

您所期待的是:

>>> 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

引自Plain Integer Objects

  

当前实现为所有实体保留了一个整数对象数组   -5256之间的整数,当你在该范围内创建一个int时   实际上只是返回对现有对象的引用。所以   应该可以更改1的值。我怀疑这种行为   在这种情况下,Python是未定义的。 : - )