【问题标题】:Why does sys.getrefcount() return 2?为什么 sys.getrefcount() 返回 2?
【发布时间】:2012-04-24 16:34:34
【问题描述】:

据我了解,sys.getrefcount() 返回对象的引用数,在以下情况下“应该”为 1:

import sys,numpy
a = numpy.array([1.2,3.4])
print sys.getrefcount(a)

然而,结果是2!所以,如果我:

del a

“numpy.array([1.2,3.4])”对象是否仍然存在(没有垃圾回收)?

【问题讨论】:

  • 你可以构建一个更简单的演示:x=1.1;打印 sys.getrefcount(x)

标签: python garbage-collection


【解决方案1】:

当您调用getrefcount() 时,引用会按值复制到函数的参数中,从而暂时增加对象的引用计数。这就是第二个引用的来源。

这在documentation中有解释:

返回的计数通常比您预期的高 1, 因为它包含(临时)引用作为参数 getrefcount().

关于你的第二个问题:

如果我“del a”,“numpy.array([1.2,3.4])”对象是否仍然存在(没有垃圾回收)?

getrefcount() 退出时,数组的引用计数将回到1,随后的del a 将释放内存。

【讨论】:

  • 如果它是“按值复制”,则不会有第二个引用。 Python 通过引用传递参数,除非明确要求,否则从不复制值。
  • @bukzor:如果你仔细阅读答案,你会发现“按价值”这个词适用于“参考”这个词,你在引用中很方便地省略了这个词。很明显,你误解了我想说的话。不幸的是,我看不到如何改写答案以提高清晰度和准确性。如果您有任何具体建议,请告诉我。
  • 当您调用 getrefcount() 时,该函数的局部变量会引用给定的参数,从而暂时增加对象的引用计数。
  • @NPE 我仍然认为“引用被复制”是错误的描述。我宁愿说“创建了对象的新引用”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-31
  • 2013-02-01
  • 2012-08-04
  • 2013-08-26
  • 1970-01-01
相关资源
最近更新 更多