我想向某人展示如何使用
is
而不是
==
来比较整数可能会失败。 我认为这会起作用,但事实并非如此:
>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True
我可以轻松地为更大的整数做到这一点:
>>> x = 500
>>> y = 500
>>> x is y
False
如何用较小的整数演示相同的事情,这些整数通常可能用于 python 中的类似枚举的目的?
Python 在内部缓存某些小的整数(尤其是介于 -5 到 256 之间的整数),以便重复使用。这意味着在的第一个示例中,
x
和
y
最终都引用了内存中的同一个
1
对象。
为了证明
is
与小型整数的比较可能会失败,需要强制创建两个单独的整数对象。一种方法是使用
int()
构造函数取消缓存的数字:
>>> x = 1
>>> y = int(str(x))
>>> x is y
False
在这个例子中:
-
x
被赋值为整数1
。 -
y
被赋值为从x
的字符串表示形式(“1”)转换而来的一个 新的 整数对象。
由于
y
是从一个新的对象创建的,而不是直接从缓存的
1
创建的,所以
x is y
返回
False
。
请记住
,这种行为是针对 CPython 实现的,并且在不同的 Python 解释器或版本中可能有所不同。依靠
is
来比较整数通常不是一个好习惯,因为它可能导致意外的结果。坚持使用
==
进行值比较。