Python增加了列表的引用计数

Python增加了列表的引用计数,python,list,python-3.5,Python,List,Python 3.5,我有一个名为bar.py的foo.py文件。我在Windows上使用Python 3.5.0 福比 巴比 我正在将一个列表从foo.py传递到bar.py。在bar.py内部,我看到传递给bar.py的list的引用计数为1,当控件通过return语句返回foo.py时,list的引用计数突然为2。对evaluateFunction的注释输出调用到处打印1。有人能解释一下发生了什么事吗?谢谢大家! 编辑:我真的不明白为什么我会因此而得到反对票。我遇到的问题相当复杂,复制它需要额外的库等等。我已经

我有一个名为bar.py的foo.py文件。我在Windows上使用Python 3.5.0

福比 巴比 我正在将一个列表从foo.py传递到bar.py。在bar.py内部,我看到传递给bar.py的list的引用计数为1,当控件通过return语句返回foo.py时,list的引用计数突然为2。对evaluateFunction的注释输出调用到处打印1。有人能解释一下发生了什么事吗?谢谢大家!

编辑:我真的不明白为什么我会因此而得到反对票。我遇到的问题相当复杂,复制它需要额外的库等等。我已经很好地确定了复制代码的范围,要求检测语义问题不值得投反对票。

在bar.py中,*args是一个元组,因此下面的代码为您提供了对该元组的引用数量:

print(len(gc.get_referrers(args)))
要获得对列表的引用数,您需要更改:

print(len(gc.get_referrers(args[0])))
我同意@juanpa.arrivillaga,您的evaluateFunction函数正在为您的列表创建一个新的引用

下面是一个较小的代码,它显示了正在进行的引用计数:

import gc

def f():
    my_list = [5]
    print("f #1: " + str(gc.get_referrers(my_list)))
    g(my_list)
    print("f #2: " + str(gc.get_referrers(my_list)))

def g(*args):
    print("g #1: " + str(gc.get_referrers(args)))
    print("g #2: " + str(gc.get_referrers(args[0])))

f()
你会得到:

f #1: [<frame object at 0x7fa82220dcc0>]
g #1: [<frame object at 0x7fa8221fc218>]
g #2: [<frame object at 0x7fa82220dcc0>, ([5],)]
f #2: [<frame object at 0x7fa82220dcc0>]

据推测,evaluateFunction正在创建对myList的引用。。。否?而且,args将是一个包含您的列表的元组,因此它不会反映它所持有的参数的引用计数。非常感谢Laurent LAPORTE和juanpa.arrivillaga的输入,不要表现得像自私自利的精英主义者,他们看不起新手程序员,否决一个合理的问题。这有助于我进一步调查这个问题。再次感谢您!
import gc

def f():
    my_list = [5]
    print("f #1: " + str(gc.get_referrers(my_list)))
    g(my_list)
    print("f #2: " + str(gc.get_referrers(my_list)))

def g(*args):
    print("g #1: " + str(gc.get_referrers(args)))
    print("g #2: " + str(gc.get_referrers(args[0])))

f()
f #1: [<frame object at 0x7fa82220dcc0>]
g #1: [<frame object at 0x7fa8221fc218>]
g #2: [<frame object at 0x7fa82220dcc0>, ([5],)]
f #2: [<frame object at 0x7fa82220dcc0>]