鉴于下面的python Idle中的代码段,为什么sys.getrefcount(a)
返回4?
在python空闲状态下执行时,给出以下代码片段
import sys
a = []
b = a
sys.getrefcount(a) # returns 3
a
sys.getrefcount(a) #returns 4
print(a)
sys.getrefcount(a) #returns 3
谁能解释为什么引用计数增加到4?
答案 0 :(得分:4)
让我们数一数
>>> import sys
>>> a = []
>>> sys.getrefcount(a)
2
我们有两个引用,一个是名称“ a”,另一个是该函数的参数(请参见here)。
>>> b = a
>>> sys.getrefcount(a)
3
“ a”,“ b”和函数arg。
>>> a
[]
>>> sys.getrefcount(a)
4
第四个来自哪里?我们正在使用REPL,在REPL中,我们使用名称_
引用了最后一个(非无)值:
>>> a
[]
>>> _
[]
如果在print
周围添加sys.getrefcount(a)
并以脚本形式运行,则在REPL(没有_ magic)之外,您将看到3。
答案 1 :(得分:1)
我可以重现您在交互式python shell中看到的内容。发生的是,当你这样做
>>> a
[]
您在变量_
中创建一个自动引用,该引用始终存储最后一个未分配表达式的值。这就是为什么在您的REPL中仅输入a
后您会得到一个附加引用:_
现在指向值a
。我认为IDLE的行为方式相同。