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。若字典中已经存储了某个对象,就会从字典中直接返回。