Возвращаясь вокруг, чтобы ответить на ваш вопрос, потому что никто еще не делал:
Я знаю, что 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
:(
И, как я уже говорил, вы не должны рассчитывать на :(
сразу происходит, только что дс произойдет в конце концов.
http://www.digi.com/wiki/developer/index.php/Python_Garbage_Collection – alko
Обычно мы говорим «ссылку», избегая неотестого слова P. И старый 'dict' в этот момент доступен для сбора мусора, поэтому не -now-, но некоторое время в будущем он будет собран. – roippi
Фактически в CPython он собирается сразу же, поскольку счетчик ссылок объекта падает до нуля. Однако это может быть неверно для других реализаций. – kindall