Python增加了列表

时间:2017-05-08 18:28:20

标签: python list python-3.5

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

foo.py

   def func(size = 100000):
       myList = [5]*size
       print(len(gc.get_referrers(myList))) #prints 1, gc is from gc module
       size = testFunction_H.testFunction_API(myList) # control goes to bar.py
       print(len(gc.get_referrers(myList))) #prints 2, why ?
       del myList

    testFunction_H = testFunction_API.init();

    for i in range(0, 30):
        func(size=1000000)

bar.py

This file has a class myClass whose below method is invoked from foo.py

    def __call__(self, *args, **kwargs)
    # args is a tuple that stores the passed list myList
        print(len(gc.get_referrers(args)))  #prints 1
        future_tuple = self._myhandle.evaluateFunction(args) #evaluateFunction is a C++ function (in a .dll file) that I invoke from Python
        print(len(gc.get_referrers(args))   #prints 1
        return 5 #return some random value    

我将一个列表从foo.py传递给bar.py.在bar.py里面我看到传递列表到bar.py的引用计数是1,当控件返回到foo.py时(通过return语句)突然显示,列表的引用计数为2.注释掉对evaluateFunction的调用打印“1 “无处不在。有人可以解释可能发生的事情吗?谢谢!

编辑:我真的不明白为什么我会为此获得反对票。我遇到的问题相当复杂,重现它会需要你额外的库,什么不是。我已经很好地确定了repro代码,并要求检测“语义”问题不值得投反对票。

1 个答案:

答案 0 :(得分: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>]