15.Python 对象的比较和拷贝

364 阅读2分钟

Python 核心技术与实战

Python 对象的比较

'==' 和  'is' 的区别

'==' 操作符比较对象之间的值是否相等。

'is' 操作符比较的是对象的身份标识是否相等,即它们是否是同一个对象,指向同一个内存地址。

Python 中 -5 ~ 256 的整型,会维持一个数组。

检查一个变量是否为 None 用 'is'。

'is' 的速度要比 '==' 快。

'is' 不能被重载,仅仅是比较变量的 ID。

'==' 可以被重载。Python 需要检查 '==' 是否被重载。重载 '==' 需要自定义 __eq__ 函数。

Python 大部分的数据类型都会重载 __eq__ 函数。如在列表中的 __eq__ 函数会遍历列表中的元素。比较顺序和值是否相同。

元组是不可变的,但元组可以嵌套。若嵌套一些可变的变量则元组可变。

浅拷贝( shallow copy)和深度拷贝( deep copy)

浅拷贝是指重新分配一块内存,创建一个新的对象里面的元素是原对象中子对象的引用。因此应注意原对象的元素是否可变。

常见的浅拷贝方法,使用数据类型本身的构造器;对于可变数列也可以使用切片操作符 ':' 完成浅拷贝;Python 也提供了 copy.copy() 方法,适用于任何数据类型,需要 import copy。

对于元组,使用 tuple() 或者切片操作符 ':'。不会创建一份浅拷贝,相反她会返回一个指向相同元组的引用。

元组不可变,对于元组进行拼接时会重新创建一个元组。

深拷贝是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式通过创建新的子对象拷贝到新对象中。新对象与原对象没有任何关联。

Python 中使用 copy.deepcopy(),需要 import copy。

存在的问题,因为使用递归的方式,如果被拷贝的对象中存在指向自身的引用,程序容易陷入无限循环。

deepcopy 函数会维护一个字典,记录已经拷贝对象与其 ID。若字典中已经存储了某个对象,就会从字典中直接返回。