2

というクラスとDoorというクラスがありWindowます。という名前のクラスの子クラスFurnitureです。私のプログラムはExcelファイルを読み取り、それを2回ループします.1回目はドアに関するすべての読み取り/書き込み、2回目は窓に関するものです。簡略化すると、次のコードがあります。

for gathering_inf in ('door', 'window'):
    for row in file:
        if gathering_inf == 'door' and currently reading door line:
            furniture = Door(width, height, description)
        if gatherig_inf == 'window' and currently reading window line:
            furniture = Window(width, height, description)

        # Now do something with the furniture object ..

たとえば、(上記のように) objectfurnitureを印刷すると、それらの場所が取得され、メモリ内のオブジェクトの場所の一部は、2 つの異なるインスタンス幅の異なる属性であっても同じです。例えば:

<__main__.Door object at 0x03BFE810>
<__main__.Door object at 0x03BFE890>
<__main__.Door object at 0x03BFE810>
<__main__.Door object at 0x03BFE890>
<__main__.Door object at 0x03BFE8B0>
<__main__.Door object at 0x03BFE8D0>
<__main__.Door object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE8D0>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>
<__main__.Window object at 0x03BFE8B0>
<__main__.Window object at 0x03BFE890>

なぜPythonがこのように動作するのか、誰かが私に説明してもらえますか?

4

2 に答える 2

4

これは、参照カウント ガベージ コレクターが原因です。新しいオブジェクトが GC に割り当てられるとすぐにオブジェクトfurnitureが削除されるため、そのメモリの場所は新しいオブジェクトで再利用できます。


これは、この動作を示す小さなデモです。Python REPL の動作 (最後の結果への参照を保持する_) のため、アドレスが交互になることに注意してください。

>>> foo = object(); foo
<object object at 0x7fd74cd390a0>
>>> foo = object(); foo
<object object at 0x7fd74cd390b0>
>>> foo = object(); foo
<object object at 0x7fd74cd390a0>
>>> foo = object(); foo
<object object at 0x7fd74cd390b0>
>>> foo = object(); foo
<object object at 0x7fd74cd390a0>
于 2012-12-23T13:49:57.310 に答える
1

ThiefMasterはそれをほぼ釘付けにしました:それはPython仮想マシンが機能する方法です。

観察しているのは、ガベージコレクターをカウントする参照のCPython実装の詳細です。この場合のCPythonは、オブジェクトをガベージコレクションし、新しいオブジェクトを作成してから、(現在はガベージコレクションされている)オブジェクトの場所を再利用して、そこにオブジェクトを格納します。DoorWindowDoorWindow

実際、以前にガベージコレクションされたオブジェクトのアドレスをCPythonが再利用するのはよくあることです。たとえば、ThiefMasterのコードをコンピューターで実行すると、わずかに異なる(回転)結果が得られました。

CPythonのメモリ使用量

この時点で、この動作はCPython特定のものであることに注意することが重要です。たとえば、EnthoughtのPythonディストリビューションは同様の結果を生成しないようですが、この不整合が実装の違いの問題であるかどうかはわかりません。

ここに画像の説明を入力してください

于 2012-12-23T14:01:42.800 に答える