2013-11-07 3 views
1

У меня есть ponter к dict() и я продолжаю обновлять его, как это:, что происходит с Dict, без указателя

def creating_new_dict(): 
    MyDict = dict() 
    #... rest of code - get data to MyDict 
    return MyDict 

def main(): 
    while(1): 
     MyDict = creating_new_dict() 
     time.sleep(20) 

Я знаю, что MyDict является указателем на dict так Мой вопрос что происходит со старыми данными в MyDict? Удален ли он или я должен убедиться, что он ушел?

+0

http://www.digi.com/wiki/developer/index.php/Python_Garbage_Collection – alko

+3

Обычно мы говорим «ссылку», избегая неотестого слова P. И старый 'dict' в этот момент доступен для сбора мусора, поэтому не -now-, но некоторое время в будущем он будет собран. – roippi

+0

Фактически в CPython он собирается сразу же, поскольку счетчик ссылок объекта падает до нуля. Однако это может быть неверно для других реализаций. – kindall

ответ

5

Возвращаясь вокруг, чтобы ответить на ваш вопрос, потому что никто еще не делал:

Я знаю, что MyDict является указателем на Dict

Эххх. MyDict является ссылкой на ваш dict объект, а не указатель. Незначительное отступление следующим образом:


Вы не можете мутировать неизменные типы внутри функции, потому что вы обработки ссылки, а не указатели. См:

def adder(x): 
    x = x + 1 

a = 0 
adder(a) 
a 
Out[4]: 0 

Я не буду слишком далеко вниз по кроличьей норе, но только в этом: нет ничего, что я мог бы поместить в тело adder, что вызвало бы a изменить. Поскольку переменные являются ссылками, а не указателями.


Хорошо, мы вернулись.

так что мой вопрос - что происходит со старыми данными в MyDict?

Ну, он все еще там, где-то в каком-то объекте, но вы взорвали ссылку на него. Ссылка больше не была, она перестала быть. Фактически, существует ровно нулевая ссылка на старый dict, который будет значительным в следующем абзаце!

ли удален

Это не удаляется сама по себе, но вы могли бы в принципе думать его как удаленные. У него нет оставшихся ссылок, что означает, что он имеет право на сбор мусора. Python's gc, при запуске, придет и избавится от всех объектов, у которых нет оставшихся ссылок, включая все ваши осиротевшие dict s.

Но, как я уже сказал в своем комментарии: gc не будет запущен -now-, но некоторое время в (возможно, очень близком) будущем. Как скоро это произойдет, зависит от того, какой вкус питона вы используете. cPython (тот, который вы, вероятно, запускаете), обычно будет gc объектом немедленно, но это не гарантируется и не следует полагаться на - он оставлен до реализации. На что вы можете рассчитывать - gc придет и уберёт в конце концов. (хорошо, если вы не отключили его)

или я должен убедиться, что он ушел?

Nooooo. Неа. Не делайте работу сборщика мусора. Если у вас есть очень конкретная причина в производительности, вы должны это сделать.

Я все еще не верю вам, покажите мне пример.

Э-э, вы сказали это, верно? Хорошо:

class DeleteMe: 
    def __del__(self): #called when the object is destroyed, i.e. gc'd 
     print(':(') 

d = DeleteMe() 
d = DeleteMe() # first one will be garbage collected, leading to sad face 
:(

И, как я уже говорил, вы не должны рассчитывать на :( сразу происходит, только что дс произойдет в конце концов.

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