Идеи управления памятью Python - id ( )

Игра с id () . Начал с поиска адресов одинаковых атрибутов в неидентичных объектах. Но, думаю, сейчас это не имеет значения. Вплоть до кода:

class T(object):
    pass

class N(object):
    pass

Первый тест (в интерактивной консоли):

n = N()
t = T()
id(n)
# prints 4298619728
id(t)
# prints 4298619792

На самом деле ничего удивительного. n .__ class __ отличается от t .__ class __ , поэтому кажется очевидным, что они не могут быть одним и тем же объектом. Является ли __ класс __ единственной разницей между этими объектами в настоящее время? Предполагая no , как:

>>> n1 = N()
>>> n2 = N()
>>> id(n1) == id(n2)
False

Или Python просто создает отдельные объекты, даже если они совершенно одинаковы по содержанию, вместо присвоения им имен n1 , n2 сначала одному и тому же объекту (в памяти) и переназначить при изменении n1 или n2 ? Почему так? Я понимаю, что это может быть вопрос соглашения, оптимизации, настроения, проблем низкого уровня (не щадите меня), но все же мне любопытно.

Теперь те же классы, что и раньше, T () & N () - выполняются один за другим в оболочке:

>>> id(N())
4298619728
>>> id(N())
4298619792
>>> id(N())
4298619728
>>> id(N())
4298619792

Почему жонглирование?

Но вот и самое странное. Опять же, те же классы, оболочка:

>>> id(N()), id(T())
(4298619728, 4298619728)
>>> id(N()), id(T())
(4298619728, 4298619728)
>>> id(N()), id(T())
(4298619728, 4298619728)

Не только жонглирование прекращается, но и N () и T () кажутся одним и тем же объектом. Поскольку они не могут быть такими, я понимаю это как то, что все, что возвращает N () , уничтожается после вызова id () , до конца всего оператора .

Я понимаю, что это может быть трудным ответом . Но я надеюсь, что кто-нибудь сможет сказать мне, что я здесь наблюдаю, правильно ли я понимаю, поделится какой-то темной магией о внутренней работе и управлении памятью интерпретатора или, возможно, укажет на некоторые полезные ресурсы по этой теме?

Спасибо, что уделили время этому.

5
задан maligree 18 July 2011 в 13:17
поделиться