2012-04-24 58 views
12

据我所知,sys.getrefcount()返回一个对象,在以下的情况下,其中“应该” 1的引用的数目:为什么sys.getrefcount()返回2?

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

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

del a 

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

+1

你可以构造一个简单的演示:X = 1.1;打印sys.getrefcount(x) – 2014-12-10 10:17:38

回答

20

当你调用getrefcount(),参考由值到函数的参数复制,暂时撞到了对象的引用计数。这是第二个参考文献的来源。

这在documentation解释:

返回的计数是通常一个高于你所期望的, 因为它包含了(临时)引用作为参数传递给 getrefcount().

至于你的第二个问题:

如果我“删除”,将“numpy.array([1。 2,3.4])“对象仍然存在(没有垃圾回收)?

通过时间getrefcount()退出时,所述阵列的引用计数将要回1,以及随后的将del a释放存储器。

+0

如果它被“按值复制”,则不会有第二个引用。 Python通过引用传递参数,除非明确询问,否则不会复制值。 – bukzor 2014-03-07 23:37:25

+0

@bukzor:如果你仔细阅读了答案,你会看到这样的词语“按值”适用于单词“参考”,你已经方便地从你的报价省略。很明显,你误解了我想说的话。不幸的是,我不明白我如何改正答案以提高清晰度和精确度;如果您有任何具体的建议,请告诉我。 – NPE 2014-03-08 07:54:13

+2

当你调用getrefcount(),该函数的局部变量引用给定的说法,暂时撞了对象的引用计数。 – bukzor 2014-03-08 19:57:37

相关问题