Python“is”和“==”的区别

变量:用来标识(identify)一块内存区域。为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元。编译器负责分配。我们可以使用Python内建函数id()来获取变量的地址

变量名:是一个标识符(dientify),用来代之一块内存空间,使用这个变量名,我们可以很方便的操作这块内存区域。

内存:内存是我们电脑硬件,用来存放数据,形象的理解就是内存有一个一个的小格子组成,每个格子的大小是一个字节,每个格子可以存放一个字节大小的数据。我们如何才能知道,数据存放在哪些格子中,那就得靠地址,地址类似于楼房的门牌号,是内存的标识符。

==:判断两个量的“值”是否相同,默认会调用对象的__eq__()方法。
基本语法:A == B
返回bool值,当A和B的值相同时,返回True,否则返回False。

 is:判断两个量的“内存地址”是否相同,也就是比较俩对象是否为同一个实例对象

基本语法:A is B(即判断id(A)是否等于id(B))

返回bool值,当A和B的内存地址相同时,返回True,否则返回False。

 

如果A is B为True,那么A==B必然也是True,因为同一块地址肯定只能存一个值;反过来则不成了,如果A==B为True,A is B不一定为True,因为相同的值可以存储在不同的内存中。因此is判断比==更严格。

>>>a = [1,2,3]
>>>b = a
>>>print(a == b)
True
>>>print(a is b)
True
>>>print(id(a))
96345160
>>>print(id(b))
96345160

上例中,a = [1,2,3],首先开辟了一块内存地址,并将该地址的值设置为[1,2,3],然后将变量(引用)a指向这块内存。b=a则是将变量(引用)b也指向这块内存地址(python决定了这种“变量之间的直接赋值方式”不会新开辟一块内存),结果就是a和b指向相同的地址,当然值也相同。因此a is b 和a == b 的结果都是True。

例2:

>>>a = [1,2,3]
>>>b = [1,2,3]
>>>print(a == b)
True
>>>print(a is b)
False
>>>print(id(a))
96653000
>>>print(id(b))
96615176

例2仅仅是把b = a换成了b = [1,2,3],这两者有本质的差异,后者重新开辟了一块内存,并把他的值设置为[1,2,3],然后将b指向这块内存。显然a == b是True,因为值相同;而a is b为False,因为两者指向了不同的内存地址。

 




posted @ 2020-06-23 17:51  熊猫meme  阅读(240)  评论(0)    收藏  举报