python中的对象引用和垃圾回收

python中的对象引用和垃圾回收

每个变量都有标识、类型和值。对象一旦创建,它的标识绝不会
变;你可以把标识理解为对象在内存中的地址。is 运算符比较两个
对象的标识;id() 函数返回对象标识的整数表示。
可以把创建变量看作是贴标签,创建对象之后才会把变量分配给对象

==和is的区别

  • ==比较的是两个对象的值,is比较的是两个对象在内存中的标识(内存地址)是否相同
  • is一般用来判断None对象
  • 而 a == b 是语法糖,等同于 a.eq(b)。继承自 object 的 __eq__方法比较两个对象的 ID

默认都是浅拷贝

深复制(即副本不共享内部对 象的引用)

  • 简单的赋值不创建副本
  • 构造方法l2 = list(l1)或 [:] 做的是浅复制,修改其中一个对象值,不会影响另外的一个
  • 对可变的对象来说,+= 运算符就地修改列表
  • 对元组来说,+= 运算符创建一个新元组,然后重新绑定给变量

del

  1. del一个对象,只是删除对它的引用,只有当删除的时候是最后一个引用的时候,才会从内存中删除该对象地址
  2. 如果两个对象相互引用,当它们的引用只存在二者之间时,垃圾回收程序 会判定它们都无法获取,进而把它们都销毁。

垃圾回收

在 CPython 中,垃圾回收使用的主要算法是引用计数。实际上,每个对 象都会统计有多少引用指向自己。当引用计数归零时,对象立即就被销 毁:CPython 会在对象上调用 __del__方法(如果定义了),然后释放 分配给对象的内存。