2017-05-08 63 views
-3

我有一個文件foo.py,它調用bar.py.我在Windows上使用Python 3.5.0。Python增加列表引用計數

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

據推測,'evaluateFunction'正在創建'myList'參考......不是嗎? –

+0

此外,'args'將是包含您的列表的一個*元組*,所以這就是爲什麼它不反映它所包含的參數的引用計數。 –

+4

這不代表您的真實代碼。我們不能運行這個,我們不能調試這個。 – user2357112

回答

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>] 
+0

非常感謝Laurent LAPORTE和juanpa.arrivillaga的投入,而不是像利己主義的精英主義者那樣低頭看待新手程序員,並且倒下了一個合理的問題。它幫助我進一步調查這個問題。再一次感謝你! – Harry