【发布时间】:2019-06-07 02:53:29
【问题描述】:
我在 Windows 上的 Python 3.7 中使用 sys.getrefcount。我尝试了以下方法:
>>> import sys
>>> x = "this is an arbitrary string"
>>> sys.getrefcount(x)
2
我了解其中一个引用是x,另一个是sys.getrefcount 内部使用的参数。无论x 初始化为哪种类型,这似乎都有效。但是,当我在通过之前没有分配时,我注意到了一些奇怪的行为:
>>> import sys
>>> sys.getrefcount("arbitrary string")
2
>>> sys.getrefcount(1122334455)
2
>>> sys.getrefcount(1122334455+1)
2
>>> sys.getrefcount(frozenset())
2
>>> sys.getrefcount(set())
1
>>> sys.getrefcount(object())
1
>>> sys.getrefcount([])
1
>>> sys.getrefcount(lambda x: x)
1
>>> sys.getrefcount(range(1122334455))
1
>>> sys.getrefcount(dict())
1
>>> sys.getrefcount(())
8341
>>> sys.getrefcount(tuple())
8340
>>> sys.getrefcount(list("arbitrary string"))
1
>>> sys.getrefcount(tuple("arbitrary string"))
1
>>> sys.getrefcount(("a", "r", "b", "i", "t", "r", "a", "r", "y", " ", "s", "t", "r", "i", "n", "g"))
2
这里发生了什么?似乎不可变类型有两个引用,但可变类型只有一个?为什么看起来有些对象在传递之前已分配,而另一些对象则只有引用作为参数?
这和str/int/tuple实习有关系吗?
编辑:一个更直接的问题:为什么选择像frozenset() 这样的不可变类型在构造时有引用,而像set() 这样的可变类型没有?我孤立地理解为什么您可能会选择保留此全局范围参考,或不全面保留,但为什么会出现差异?
【问题讨论】:
标签: python reference garbage-collection cpython