2012-05-10 3 views
2

Я новичок в программировании, и я не понимаю, как работает сборщик мусора. В следующем примере:Удаление экземпляра Python

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, в конце? Должен ли я явно удалить его каким-то образом? Если я повторяю эту структуру много раз, причем каждый объект Objectx имеет кнопку, которая уничтожает предыдущий кадр и добавляет новый кадр с новым контентом, будет ли он потреблять все больше и больше памяти по мере продолжения программы? Спасибо за любую помощь.

ответ

3

a будет ссылаться на «уничтожены» tk.Frame

Чтобы разрешить tk.Frame быть мусора необходимо удалить эту ссылку на него

Одним из способов является установка a = None другим способом было бы del a

Конечно, когда программа на самом деле заканчивается все освобождено

+0

Спасибо, это достаточно легко. – Verdigriss

0

Итак ... если вы новичок в программировании, вам определенно не нужно даже думать о сборе мусора.

Во-первых, вам нужно знать, как переменные области работают в Python. Basic - переменные, объявленные в определенном блоке (уровне вкладки), не оставляют этот блок. Глобальные переменные модуля - это те, которые определены на первом уровне вкладок (например, в вашем примере). Истинные глобальные переменные, которые будут доступны между модулями (файлами), должны быть объявлены как таковые. Это больше, чем это, но не увлекайтесь. Прочтите ссылку в конце этого сообщения для получения более подробной информации.

Во-вторых, вы начинаете падать в шаблон преждевременной оптимизации. Испытывали ли вы чрезмерное использование памяти, вызывающее проблемы? Если это так, то и только тогда вам нужно выяснить способ выделения области видимости переменной (например, внутри тела цикла for для каждой итерации). Просто получите код, чтобы сделать то, что вы хотите, прежде чем начинать беспокоиться о производительности, а затем тратить время на изменение вещей, которые оказывают большое влияние на скорость (самые большие циклы, которые работают больше всего) или память (использование расточительных переменных).

В-третьих, сбор мусора не имеет смысла семантически, переменная область действия. Python не велик в управлении памятью, вот как это. Например, объект словаря не будет уменьшаться по размеру, даже если вы его заполняете, а затем удаляете все элементы; кроме того, когда контейнер словаря должен расти, он удваивается (т. е. 500 М -> 1G -> 2G). Но не позволяйте этому напугать вас - это редко на самом деле проблема.

Отъезд SaltyCrane's blog с переменной площадью.

Смежные вопросы