一、就你没有对象
先编个故事:从前计算机内存中有一个对象[1,2,3],许配给变量a;还有一个对象[1,2,3],许配给变量b。通过赋值给变量来保存在内存中,直到变量被删除;如果不赋值给变量,执行后就会被销毁(python垃圾回收机制)。
内存中每个对象都有一个唯一的id,可以通过python内置函数id(),查看对象的id。如果id相同,则是同一个对象;如果id不同,则不是同一个对象。
二、Python身份运算符is和is not
三、is 和 == 的区别:
is 用于判断两个变量引用对象是否为同一个。
== 用于判断引用变量的值是否相等。
1、可变数据
1)列表类型
In [28]: a=[1,2,3]
In [29]: b=[1,2,3]
In [30]: id(a)
Out[30]: 2237696798336
In [31]: id(b)
Out[31]: 2237696871488
In [32]: a==b
Out[32]: True
In [33]: a is b #id不同
Out[33]: False
2)字典类型
In [34]: a={1,2,3}
In [35]: b={1,2,3}
In [36]: id(a)
Out[36]: 2237679963040
In [37]: id(b)
Out[37]: 2237679963712
In [38]: a==b
Out[38]: True
In [39]: a is b
Out[39]: False
2、不可变数据
3)元组类型
a=(1,2,3)
b=(1,2,3)
print(id(a))
print(id(b))
print(a==b)
print(a is b)
执行结果:
2321601238592
2321601238592
True
True
4)字符串类型
In [12]: a='hello'
In [13]: b='hello'
In [14]: id(a)
Out[14]: 2382661232944
In [15]: id(b)
Out[15]: 2382661232944
In [16]: a==b
Out[16]: True
In [17]: a is b
Out[17]: True
5)数字类型
In [18]: a=123
In [19]: b=123
In [20]: id(a)
Out[20]: 140704955753952
In [21]: id(b)
Out[21]: 140704955753952
In [22]: a==b
Out[22]: True
In [23]: a is b
Out[23]: True
四、总结
针对两个变量a、b:
如果是可变数据如列表、字典:值相等(a == b),仍是不同的对象(a is not b)。
如果是不可变数据如数字、元组、字符串:值相等(a == b),则是相同的对象(a is b)。