有人能解释我的这种行为吗?
a = 'Test'
b = 'Test'
print(a is b) # True
我预计结果是False,因为a和b是不同的引用。当使用相等运算符(==(比较值相等时,我会期望得到所示的结果。
is运算符用于比较引用相等?还是我弄错了?
出现这种行为的原因是什么
简而言之:
==
表示值相等,is
表示参考相等(与id(a)==id(b)
相同(。Python缓存小对象(小int、strs等(以节省空间(自py2以来一直存在的功能(。
我最初的详细答案和例子:
因为他们完全一样!
如果两个变量指向同一个对象,is
将返回True,您可以检查id
以查看真相!
试试这个:
a = 'Test'
b = 'Test'
print(a is b)
print(id(a),id(b))
我的输出是:
True
140586094600464 140586094600464
因此,为了节省空间,Python将为指针分配相同的位置,直到做出更改为止
示例:
a = 'Test'
b = 'Test'
print(a is b)
print(id(a),id(b))
a = 'Test'
b += 'Changed'
print(a is b)
print(id(a),id(b))
True
140586094600464 140586094600464
False
140586094600464 140585963428528
一旦您进行了更改,不可变的字符串将在内存中获得新的位置!
如果这是类似list
的东西,即使它们相同,也是可变的,那么它们将获得单独的位置,因此可以进行更改!
#mutable
a= [1,2]
b= [1,2]
print(a is b)
print(id(a),id(b))
a[0] = -1
b[1] = -2
print(a is b)
print(id(a),id(b))
False
140586430241096 140585963716680
False
140586430241096 140585963716680
Int
,例如:
a=100
b=100
print(a is b)
print(id(a),id(b))
True
10917664 10917664