难以理解is操作员的特定行为

  • 本文关键字:操作员 is python
  • 更新时间 :
  • 英文 :


有人能解释我的这种行为吗?

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

最新更新