据我所知,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])” 对象仍然存在(没有垃圾收集)?
据我所知,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])” 对象仍然存在(没有垃圾收集)?
当你调用getrefcount()
,参考由值到函数的参数复制,暂时撞到了对象的引用计数。这是第二个参考文献的来源。
这在documentation解释:
返回的计数是通常一个高于你所期望的, 因为它包含了(临时)引用作为参数传递给
getrefcount().
至于你的第二个问题:
如果我“删除”,将“numpy.array([1。 2,3.4])“对象仍然存在(没有垃圾回收)?
通过时间getrefcount()
退出时,所述阵列的引用计数将要回1,以及随后的将del a
释放存储器。
如果它被“按值复制”,则不会有第二个引用。 Python通过引用传递参数,除非明确询问,否则不会复制值。 – bukzor 2014-03-07 23:37:25
@bukzor:如果你仔细阅读了答案,你会看到这样的词语“按值”适用于单词“参考”,你已经方便地从你的报价省略。很明显,你误解了我想说的话。不幸的是,我不明白我如何改正答案以提高清晰度和精确度;如果您有任何具体的建议,请告诉我。 – NPE 2014-03-08 07:54:13
当你调用getrefcount(),该函数的局部变量引用给定的说法,暂时撞了对象的引用计数。 – bukzor 2014-03-08 19:57:37
你可以构造一个简单的演示:X = 1.1;打印sys.getrefcount(x) – 2014-12-10 10:17:38