流畅的python第八章对象引用,可变性和垃圾回收
2018-01-29 10:44
495 查看
变量不是盒子
在==和is之间选择
==比较两个对象的值,而is比较对象的标识
元组的相对不可变姓
元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用。如果引用的元素是可变的,即便元组本身不可变,元素依然可变。元组的不可变姓其实是值tuple数据结构的物理内容(保存的引用)不可变,与引用对象无关。
默认做浅复制
使用构造函数和[:]做的都是浅复制
为任意对象做深复制和浅复制
copy模块提供的deepcopy和copy函数能为任意对象做深复制和浅复制
函数的参数作为引用时
整数和元组的+=重新创建一个新的值,而列表是就地添加,没有创建新的列表
不要使用可变类型作为参数的默认值
防御可变参数
如果定义的函数接受可变参数,应该谨慎考虑调用方是否期望修改传入的参数
在使用可变参数时,如果直接赋值,那么任何一方修改了,另一方都会受到印象,因为是同一个对象,如果用构造函数创建新的值则不受影响。
del和垃圾回收
del语句删除名称,而不是对象,del命令可能会导致对象被当做垃圾回收,但是仅当删除的变量保存的是对象的最后一个引用,或者无法得到对象时。重新绑定也可能会导致对象的引用数量归零,导致对象被销毁。
弱引用
WeakValueDictionary简介
python对不可变类型实加的把戏
对于不可变类型,其浅复制和深复制都是复制其的引用
在==和is之间选择
==比较两个对象的值,而is比较对象的标识
元组的相对不可变姓
元组与多数的python集合(列表,字典,集,等等)一样,保存的是对象的引用。如果引用的元素是可变的,即便元组本身不可变,元素依然可变。元组的不可变姓其实是值tuple数据结构的物理内容(保存的引用)不可变,与引用对象无关。
默认做浅复制
使用构造函数和[:]做的都是浅复制
为任意对象做深复制和浅复制
copy模块提供的deepcopy和copy函数能为任意对象做深复制和浅复制
函数的参数作为引用时
整数和元组的+=重新创建一个新的值,而列表是就地添加,没有创建新的列表
不要使用可变类型作为参数的默认值
防御可变参数
如果定义的函数接受可变参数,应该谨慎考虑调用方是否期望修改传入的参数
在使用可变参数时,如果直接赋值,那么任何一方修改了,另一方都会受到印象,因为是同一个对象,如果用构造函数创建新的值则不受影响。
del和垃圾回收
del语句删除名称,而不是对象,del命令可能会导致对象被当做垃圾回收,但是仅当删除的变量保存的是对象的最后一个引用,或者无法得到对象时。重新绑定也可能会导致对象的引用数量归零,导致对象被销毁。
弱引用
WeakValueDictionary简介
python对不可变类型实加的把戏
对于不可变类型,其浅复制和深复制都是复制其的引用
相关文章推荐
- 流程的Python 第八章:对象引用、可变性和垃圾回收
- Python 对象引用、可变性和垃圾回收
- 基于Python对象引用、可变性和垃圾回收详解
- 第8章 对象引用、可变性和垃圾回收
- Java对象的引用与垃圾回收
- Python引用复制,参数传递,弱引用与垃圾回收
- 引用一个面试题:如果程序中没有任何变量引用一个外部类对象,但有变量引用其中的内部类对象,请问外部类对象是否会被垃圾回收器回收?请说明理由!
- 两个互相引用对象的垃圾回收
- 垃圾回收机制中,引入计数是如何实现的,内部原理是什么,怎么维持对象引用的
- Java虚拟机笔记(二):GC垃圾回收和对象的引用
- python 基础学习笔记(四) 引用及垃圾回收
- jvm垃圾收集器回收什么样的对象以及各种引用
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- Python的垃圾回收机制深入分析--循环引用
- python基础 之 对象销毁(垃圾回收)
- 两个互相引用对象的垃圾回收
- Java虚拟机垃圾回收(一) 基础:回收哪些内存/对象 引用计数算法 可达性分析算法 finalize()方法 HotSpot实现分析
- python 初步认识弱引用 & 垃圾回收
- JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程
- jvm(三):对象引用与垃圾回收