在前面的学习中,我们其实已经接触到了很多 Python 对象比较和复制的例子,比如下面这个,判断 a 和 b 是否相等的 if 语句:
if a == b: ...复制代码
再比如第二个例子,这里 l2 就是 l1 的拷贝。
l1 = [1, 2, 3]l2 = list(l1)复制代码
但你可能并不清楚,这些语句的背后发生了什么。比如,
- l2 是 l1 的浅拷贝(shallow copy)还是深度拷贝(deep copy)呢?
- a == b是比较两个对象的值相等,还是两个对象完全相等呢?
关于这些的种种知识,我希望通过这节课的学习,让你有个全面的了解。
'==' VS 'is'
等于(==)和 is 是 Python 中对象比较常用的两种方式。简单来说,'=='操作符比较对象之间的值是否相等,比如下面的例子,表示比较变量 a 和 b 所指向的值是否相等。
a == b复制代码
而'is'操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,是否指向同一个内存地址。
在 Python 中,每个对象的身份标识,都能通过函数 id(object) 获得。因此,'is'操作符,相当于比较对象之间的 ID 是否相等,我们来看下面的例子:
a = 10b = 10 a == bTrue id(a)4427562448 id(b)4427562448 a is bTrue复制代码
这里,首先 Python 会为 10 这个值开辟一块内存,然后变量 a 和 b 同时指向这块内存区域,即 a 和 b 都是指向 10 这个变量,因此 a 和 b 的值相等,id 也相等,a == b和a is b都返回 True。
不过,需要注意,对于整型数字来说,以上a is b为 True 的结论,只适用于 -5 到 256 范围内的数字。比如下面这个例子:
a = 257b = 257 a == bTrue id(a)4473417552 id(b)4473417584 a is bFalse