Python3中is和==的区别?

Python3中is和==的区别?

1. 背景:
(1)变量、内存理解
变量:用来标识(identify)一块内存区域。为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元。编译器负责分配。我们可以使用Python内建函数id()来获取变量的地址。
变量名:是一个标识符(dientify),用来代之一块内存空间,使用这个变量名,我们可以很方便的操作这块内存区域。
内存:内存是我们电脑硬件,用来存放数据,形象的理解就是内存有一个一个的小格子组成,每个格子的大小是一个字节,每个格子可以存放一个字节大小的数据。我们如何才能知道,数据存放在哪些格子中,那就得靠地址,地址类似于楼房的门牌号,是内存的标识符。
(2)id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。
(3)对象包含的三个基本要素:id(身份标识)、type(数据类型)和value(值)
2. 比较判断
is比较的是对象id,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址;
==比较的是对象的value,也就是比较两个对象的内容是否相等,默认会调用对象的__eq__()方法。
3. 结论
(1)对象是数值型和字符串型时,新赋值一个对象赋值不会新建一个id,相当于值传递。所以在原对象上操作,改变值会改变id(值相同,id相同)
(2)对象是tuple,list,dict或set型时,新赋值一个对象会新建一个id,相当于新建对象。所以在原对象上操作,id不变,因为此时没有新建对象
(3)当变量赋值给对象时,相当于赋值,id不变。
4. 举例
(1)举例简单版

e=f=1
g=1
k=e
print(e is f)  # True,上述(3)
print(e is g)  # True,上述(1)
print(e is g)  # True,上述(3)
a=b=[1,2,3]
c=[1,2,3]
d=a
print(a is b)  # True,上述(3)
print(a == b)  # True
print(a is c)  # False,上述(2)
print(a == c)  # True
print(a == d)  # True,上述(3)

(2)举例复杂版

def be_careful(a, b):
    print("----a-----")
    a = 1
    print(id(a))  # 140707126472960,新对象D“1”赋值给a的id地址
    a = 2
    print(id(a))  # 140707126472992,新对象E“2”赋值给a的id地址
    print(id(2))  # 140707126472992,新对象E“2”赋值给a的id地址
    print("----b-----")
    print(id(b))  # 2087678202440,对象C“[1, 2, 3]”赋值给b的id地址
    b[0] = 'What?!'
    print(id(b))  # 2087678202440,对象C“[1, 2, 3]”赋值给b的id地址

print(id(1))  # 140707124244736,对象A“1”的id地址
a = 1
print(id(a))  # 140707124244736,对象A“1”赋值给a的id地址
print(id([1, 2, 3]))  # 1753786176072,对象B“[1, 2, 3]”的id地址
b = [1, 2, 3]
print(id(b))  # 1753786176072,对象B“[1, 2, 3]”赋值给b的id地址
b = [1, 2, 3]
print(id(b))  # 1753786176072,新建一个对象C“[1, 2, 3]”赋值给b的id地址

be_careful(a, b)  # 见函数
print(a, b)  # 1 ['What?!', 2, 3]

print(id(2))  # 140707126472992,对象E“2”赋值给a的id地址
print(id(b))  # 1753786176072,对象C“[1, 2, 3]”赋值给b的id地址

附图:
Python3中is和==的区别?_第1张图片

你可能感兴趣的:(Python3中is和==的区别?)