python中的对象引用和垃圾回收
每个变量都有标识、类型和值。对象一旦创建,它的标识绝不会
变;你可以把标识理解为对象在内存中的地址。is 运算符比较两个
对象的标识;id() 函数返回对象标识的整数表示。
可以把创建变量看作是贴标签,创建对象之后才会把变量分配给对象
==和is的区别
==
比较的是两个对象的值,is
比较的是两个对象在内存中的标识(内存地址)是否相同is
一般用来判断None对象- 而 a == b 是语法糖,等同于 a.eq(b)。继承自 object 的
__eq__
方法比较两个对象的 ID
默认都是浅拷贝
深复制(即副本不共享内部对 象的引用)
- 简单的赋值不创建副本
- 构造方法
l2 = list(l1)
或 [:] 做的是浅复制,修改其中一个对象值,不会影响另外的一个 - 对可变的对象来说,+= 运算符就地修改列表
- 对元组来说,+= 运算符创建一个新元组,然后重新绑定给变量
del
- del一个对象,只是删除对它的引用,只有当删除的时候是最后一个引用的时候,才会从内存中删除该对象地址
- 如果两个对象相互引用,当它们的引用只存在二者之间时,垃圾回收程序 会判定它们都无法获取,进而把它们都销毁。
垃圾回收
在 CPython 中,垃圾回收使用的主要算法是引用计数。实际上,每个对 象都会统计有多少引用指向自己。当引用计数归零时,对象立即就被销 毁:CPython 会在对象上调用
__del__
方法(如果定义了),然后释放 分配给对象的内存。