在下面的程序中,有一个全局变量 a,我想检查 1、2、3 和 4 点处的引用数量。
import sys
a = 'my-string'
print(sys.getrefcount(a))
b = [a]
print(sys.getrefcount(a))
del b
print(sys.getrefcount(a))
c = { 'key': a }
print(sys.getrefcount(a))
当我执行程序时,我看到引用的数量分别是4、5、4、5。我不明白为什么会这样。
我的第一个想法是,所有的全局变量都是从堆栈的静态段分配的,因此,对于每个
a
,b = [a]
和c = { 'key': a }
,都有一个引用,组成3个引用。每个 print(sys.getrefcount(a))
都有一个参考,总共 4 个参考。
如果是这样的话,
b = [a]
和c = { 'key': a }
之后的语句中的第5个引用来自哪里,特别是删除b
之后?
我相信参考文献的答案是:
globals()
字典)getrefcount
您可以观察到有关 CPython 工作方式的一些有趣的事情:
"my-string"
而不是 a
,数字不会改变[]
或object()
、set()
,您将看到一个模式2,3,2,3
,表明上面列表中的前两个整体不再存在。