我发现了一个有趣的事情,即使用"is"来判断两个变量是否相同。 以下是我的代码和结果:
a = 256
b = 256
c = 257
d = 257
print(a is b)
print(c is d)
结果显示:
True
False
实际上,当数字大于 256 时,它会变成"假"。
再比如:
a = 'a' * 20
b = 'a' * 20
c = 'a' * 21
d = 'a' * 21
print(a is b)
print(c is d)
结果:
True
False
同样,当"a"* n"中的n大于20时,它将变为"假"。
但是当我把它放到一个函数中时,数字有多大并不重要:
def is_test(a):
x = a
y = a
print(x is y)
is_test(257)
is_test('a' * 21)
结果始终为"真实">
我在Jupyter Notebook上运行了代码。 任何人都可以向我解释一下吗?谢谢
是检查它们是否是同一个对象(内存中的同一位置(== 检查它们是否具有相等的值,低值预先存储并因此指向相同的内存空间。 例如,每次需要时都写一个新的 1 和 0 只是因为它用于新用途是愚蠢的, 由于这两个数字经常被使用,所以它们只指向一个预先写好的数据表,其中包含 1 和 0,其中包括低数字和其他常用值。
首先,is
检查两个标识符是否引用同一对象,同时==
检查相等性,并在适用的情况下调用__eq__()
。
在CPython中,从-5到256的整数在启动时被"缓存",当你这样做a = 256
时,你只需返回对预定义int
对象的引用。对于 257 及更高版本,它是在旅途中创建的,因此您可能会获得两个值为 257 的int
对象。
对于长度为 20 及以下且其值为有效标识符*的字符串,它们也以相同的方式缓存。这就是为什么当你定义这样的字符串两次时,你会得到相同的对象引用。
* 例如,字符串"a1b2c3"
的值是有效的标识符,而">:})_!#*^"
则不是。
源。
a = 256
b = 256
c = a
if (a == b):
print("True")
else:
print("False")
if (a is b):
print("True")
else:
print("False")
if (a is c):
print("True")
else:
print("False")
输出:
True
False
True
描述
True
: 第一个if condition
的输出True
,因为a
和b
都有 相同的值。False
: 第二if condition
显示False
因为a
和b
在 不同的内存位置。因此,它们指的是不同的对象。 我们可以在 python 中使用id()
函数进行检查,该函数identity
返回 一个对象。True
: 第三if condition
的输出True
为a
和c
指向同一对象。
您可以在此处引用纯整数对象。
"当前的实现为-5到256之间的所有整数保留了一个整数对象数组,当您在该范围内创建一个int时,您实际上只是返回对现有对象的引用。因此,应该可以更改 1 的值。我怀疑在这种情况下Python的行为是未定义的。:-)">
这就是为什么你会得到相同的 id(( 对于 -5 ~ 256 的数字。 至于其他数字,它的引用方式会有所不同。
是识别是否引用同一对象的方法,但==检查值是否相等。