Игра с 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 ()
, до конца всего оператора .
Я понимаю, что это может быть трудным ответом . Но я надеюсь, что кто-нибудь сможет сказать мне, что я здесь наблюдаю, правильно ли я понимаю, поделится какой-то темной магией о внутренней работе и управлении памятью интерпретатора или, возможно, укажет на некоторые полезные ресурсы по этой теме?
Спасибо, что уделили время этому.