流畅的python第八章对象引用,可变性和垃圾回收

变量不是盒子

流畅的python第八章对象引用,可变性和垃圾回收

在==和is之间选择

==比较两个对象的值,而is比较对象的标识

流畅的python第八章对象引用,可变性和垃圾回收

元组的相对不可变姓

元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用。如果引用的元素是可变的,即便元组本身不可变,元素依然可变。元组的不可变姓其实是值tuple数据结构的物理内容(保存的引用)不可变,与引用对象无关。

流畅的python第八章对象引用,可变性和垃圾回收

默认做浅复制

使用构造函数和[:]做的都是浅复制

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

为任意对象做深复制和浅复制

copy模块提供的deepcopy和copy函数能为任意对象做深复制和浅复制

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

函数的参数作为引用时

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

整数和元组的+=重新创建一个新的值,而列表是就地添加,没有创建新的列表

不要使用可变类型作为参数的默认值

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

防御可变参数

如果定义的函数接受可变参数,应该谨慎考虑调用方是否期望修改传入的参数

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

在使用可变参数时,如果直接赋值,那么任何一方修改了,另一方都会受到印象,因为是同一个对象,如果用构造函数创建新的值则不受影响。

del和垃圾回收

del语句删除名称,而不是对象,del命令可能会导致对象被当做垃圾回收,但是仅当删除的变量保存的是对象的最后一个引用,或者无法得到对象时。重新绑定也可能会导致对象的引用数量归零,导致对象被销毁。

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

弱引用

流畅的python第八章对象引用,可变性和垃圾回收

WeakValueDictionary简介

流畅的python第八章对象引用,可变性和垃圾回收

流畅的python第八章对象引用,可变性和垃圾回收

python对不可变类型实加的把戏

对于不可变类型,其浅复制和深复制都是复制其的引用

流畅的python第八章对象引用,可变性和垃圾回收