我想向某人展示如何使用is
代替==
来比较整数可能会失败。我认为这会奏效,但事实并非如此:
>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True
我可以轻松地为更大的整数做到这一点:
>>> x = 500
>>> y = 500
>>> x is y
False
如何使用较小的整数来演示相同的东西,这些整数通常可用于python中类似于枚举的目的?
答案 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
当前实现为所有实体保留了一个整数对象数组
-5
和256
之间的整数,当你在该范围内创建一个int时 实际上只是返回对现有对象的引用。所以 应该可以更改1
的值。我怀疑这种行为 在这种情况下,Python是未定义的。 : - )