sys.getrefcount(a)的详细信息

时间:2018-09-01 14:04:05

标签: python

鉴于下面的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?

2 个答案:

答案 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的行为方式相同。