Python "is"和"=="问题



我发现了一个有趣的事情,即使用"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

描述

  1. True: 第一个if condition的输出True,因为ab都有 相同的值。

  2. False: 第二if condition显示False因为ab在 不同的内存位置。因此,它们指的是不同的对象。 我们可以在 python 中使用id()函数进行检查,该函数identity返回 一个对象。

  3. True: 第三if condition的输出Trueac指向同一对象。

您可以在此处引用纯整数对象。

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

这就是为什么你会得到相同的 id(( 对于 -5 ~ 256 的数字。 至于其他数字,它的引用方式会有所不同。

识别是否引用同一对象的方法,但==检查值是否相等。

相关内容

最新更新