【问题标题】:What happens to a Python list object in memory when it has been dereferenced from a Variable?从变量中取消引用后,内存中的 Python 列表对象会发生什么?
【发布时间】:2015-08-06 18:54:05
【问题描述】:

从变量中取消引用后,内存中的 Python 列表对象会发生什么情况?

例子

A = ["A", "B"]
print(A)
A = []
A = None
print(A)

["A", "B"] 会发生什么?

【问题讨论】:

  • 它会被垃圾收集。内存被释放用于其他用途
  • 在对象上调用垃圾回收之前,它在内存中存储了多少秒?
  • 取消引用表示查找引用。你的意思是不再被引用
  • 对不起,我想这就是我的意思,例如它不再在程序中的任何地方使用。

标签: python list memory


【解决方案1】:

不再有任何引用指向它们的对象将被删除。

CPython 通过引用计数来实现这一点;赋值会增加引用计数,删除引用会减少引用计数。当计数达到 0 时,对象会被自动删除。

边缘情况是当一个对象直接或间接指向自身时;例如通过向自身添加一个列表:

>>> a = []
>>> a.append(a)
>>> a
[[...]]

那里的省略号表示参考循环。 Python 使用垃圾收集器来检测和中断此类循环;它会定期运行以查找未被任何其他对象引用的对象图。

【讨论】:

  • 您知道为什么如果我将 None 分配给 A 并且我执行 sys.getrefcount(A) 它返回 5000 吗?但如果 A = [] 它返回 2?
  • @MatthewduPlessis: None 是一个单例对象,Python 只有 一个 该对象的实例。你有 5000 个不同的引用。使用None 语法只会为您提供对该对象的另一个引用。
  • @MatthewduPlessis:另一方面,您的 [] 对象是一个单独的、唯一的实例。 a 是唯一的引用,第二个引用是 Python 堆栈,因为它将值传递给 sys.getrefcount() 函数。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 2016-06-14
  • 2010-11-18
  • 2020-07-14
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
相关资源
最近更新 更多