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
で
はおそらく、 'evaluateFunction'はありません... myList''への参照を作成しています。ここ
は、動作中の参照カウントを示し小さいコードですか? –
また、 'args'はあなたのリストを含む*タプル*になるので、それが保持する引数の参照カウントが反映されないのはこのためです。 –
これは実際のコードを表しているわけではありません。これを実行することはできません。これをデバッグすることはできません。 – user2357112