2

私はプログラミングが初めてで、ガベージ コレクションのしくみを理解できません。次の例では:

import Tkinter as tk

a = 0

class Object1:

    def __init__(self):
        global a
        a = tk.Frame()
        a.pack()
        b = tk.Button(a, text="click me", command=self.callback)
        b.pack()

    def callback(self):
        print "clicked!"
        program = Object2()

class Object2:

    def __init__(self):
        global a
        a.destroy()
        a2 = tk.Frame()
        a2.pack()
        b = tk.Label(a2, text='This is the second object.')
        b.pack()



program = Object1()

tk.mainloop()

Object1 のインスタンスである「program」は最後に残っていますか? どうにかして明示的に削除する必要がありますか? この構造を何度も繰り返すと、各 Objectx に前のフレームを破棄し、新しいコンテンツを含む新しいフレームを追加するボタンがある場合、プログラムが進行するにつれて、より多くのメモリが消費されますか? 助けてくれてありがとう。

4

2 に答える 2

3

a「破壊された」を参照しますtk.Frame

tk.Frameガベージコレクションできるようにするには、その参照を削除する必要があります

a = None1 つの方法は、別の方法を設定することです。del a

もちろん、プログラムが実際に終了すると、すべてが解放されます

于 2012-05-10T01:33:10.803 に答える
0

したがって...プログラミングに不慣れな場合は、ガベージコレクションについて考える必要さえありません。

まず、変数スコープが Python でどのように機能するかを知る必要があります。基本 - 特定のブロック (タブ レベル) で宣言された変数は、そのブロックを離れません。モジュールのグローバル変数は、最初のタブ レベルで定義されたものです (例の a など)。モジュール (ファイル) 間でアクセスできる真のグローバル変数は、そのように宣言する必要があります。それだけではありませんが、夢中にならないでください。詳細については、この投稿の最後にあるリンクをお読みください。

第二に、時期尚早の最適化のパターンに陥り始めています。問題の原因となっている過度のメモリ使用を経験したことがありますか? その場合は、変数のスコープを分離する方法を見つける必要があります (たとえば、各反復の for ループ本体内)。パフォーマンスを気にし始める前に、必要なことを実行するコードを取得し、速度 (最も実行される最大のループ) またはメモリ (無駄な変数の使用) に大きな影響を与えるものだけを変更することに時間を費やします。

第 3 に、ガベージ コレクションは意味的には関係ありませんが、変数のスコープは関係があります。Python はメモリの管理が得意ではありません。たとえば、ディクショナリ オブジェクトを埋めてからすべての項目を削除しても、そのサイズは小さくなりません。さらに、ディクショナリ コンテナを拡張する必要がある場合、2 倍になるだけです (つまり、500M --> 1G --> 2G)。しかし、怖がらせないでください。実際に問題になることはめったにありません。

可変スコープに関するSaltyCrane のブログをチェックしてください。

于 2012-05-10T04:59:55.910 に答える