1

私が扱っている元の問題の概要をここに示します。元の問題に関連する追加の質問(Python参照カウントについて)をしたいと思います。

私が次のスクリプトを持っているとしましょう:

from bitarray import bitarray
from array import array

list1=[bitarray('00011'), bitarray('00010'), bitarray('11011')]
list2=[array('i',[0,0,0,0]),array('i',[1,1,1,1]),array('i',[2,2,2,2])]

def calculate(l1,l2):
    result1=l1[0]&l1[1]&l1[2]
    result2=l2[0][0]+l2[1][1]+l2[2][2]
return result1, result2

print calculate(list1,list2)

の参照カウントlist1list2またはいずれかのリスト内のオブジェクトのいずれかは、呼び出したときにある時点で変更されcalculate(list1,list2)ますか?

明確にするために:参照カウントが呼び出しの前後で同じになるかどうかを意味するものではありませんcalculate(list1,list2)。つまり、の実行中の任意の時点で参照カウントが変更された場合ですcalculate(list1,list2)

4

1 に答える 1

3

の参照カウントは変更list1されlist2ません。これらは単なる変数であり、locals()名前空間内の文字列キーです。

これらの2つの変数が指すPythonリストオブジェクトは、もちろん、関数に渡されると参照カウントが変わります。関数の呼び出し中に、2つの新しい変数がそれらのリスト(l1およびl2)を参照してカウントを増やし、関数が戻ると、これらの変数がクリーンアップされ、refカウントが再び減少します。

関数内ではcalculate()、これら2つのリストの項目(l1[0]など)にアクセスしています。アイテムへのアクセスには__getitem__、オブジェクトのメソッドを使用できます。メソッドは、アクセス時にオンザフライで作成され、インスタンスと基になる関数への参照を保持します。リストオブジェクトへの別の参照であるリストの場合、別の一時的な参照カウントが増加します。関数が呼び出されてその値が返されると、メソッドは再び破棄され(何も参照していません)、リストの参照カウントが再び低下します。

デルナンがコメントで正しく指摘しているように、リストサブスクリプションの場合、BINARY_SUBSCRオペコードはアクセスを最適化し(インデックスが整数の場合)、その特定のケースではメソッドは作成されません。

ただし、Pythonインタープリターは、スタック上のバ​​イトコードと値を処理するときに、参照カウントを常に増減させています。Pythonのバイトコード評価ループを調べ、発生回数Py_INCREFと発生回数を数えて、Py_DECREFこれがどれほど一般的であるかを把握します。

于 2013-01-03T11:05:57.163 に答える