2017-05-08 8 views
-3

bar.pyを呼び出すfoo.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  

私はbar.py.するfoo.pyからリストを渡していますbar.pyの内部では、bar.pyに渡されたリストの参照カウントが1であり、制御がfoo.py(return文を介して)に戻ったときに、リストの参照カウントが2であることが突然表示されています。evaluateFunction " どこにでも。誰かが何が起こっているかも説明できますか?ありがとうございました!

編集:私は真剣にこれに対して否定的な票を得ている理由を理解していません。私が持っている問題はかなり複雑で、それを再現するには追加のライブラリが必要です。私は復興コードをかなりスコープしており、「意味論的」問題を検出するよう求めているのは、否定的な投票に値するものではありません。 bar.py

+1

はおそらく、 'evaluateFunction'はありません... myList''への参照を作成しています。ここ

は、動作中の参照カウントを示し小さいコードですか? –

+0

また、 'args'はあなたのリストを含む*タプル*になるので、それが保持する引数の参照カウントが反映されないのはこのためです。 –

+4

これは実際のコードを表しているわけではありません。これを実行することはできません。これをデバッグすることはできません。 – user2357112

答えて

1

*引数はタプルであるので、次のコードは、そのタプルにあなたの参照の数を与える:

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