为什么sys.getrefcount()返回2?

Hai*_*ang 18 python garbage-collection

据我所知,sys.getrefcount()返回一个对象的引用数,在下列情况下"应该"为1:

import sys,numpy
a = numpy.array([1.2,3.4])
print sys.getrefcount(a)
Run Code Online (Sandbox Code Playgroud)

然而,事实证明是2!所以,如果我:

del a
Run Code Online (Sandbox Code Playgroud)

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

NPE*_*NPE 31

当您调用时getrefcount(),引用将按值复制到函数的参数中,暂时提升对象的引用计数.这是第二个参考来自的地方.

这在文档中解释:

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

至于你的第二个问题:

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

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

  • @bukzor:如果您仔细阅读答案,您会发现“按值”一词适用于“引用”一词,您已方便地从引用中省略了该词。很明显你误解了我想表达的意思。不幸的是,我不知道如何改写答案以提高清晰度和准确性;如果您有任何具体建议,请告诉我。 (4认同)
  • 当你调用getrefcount()时,该函数的局部变量引用给定的参数,暂时提高对象的引用计数. (2认同)
  • @NPE我仍然认为“引用被复制”是一个错误的描述。我宁愿说“创建了该对象的新引用” (2认同)