Я делаю некоторые вещи в python (используя python 3.3.3), и я наткнулся на то, что меня сбивает с толку, так как мой понятный класс получает новый идентификатор каждый раз, когда он вызывается.Почему идентификатор класса Python не уникален при вызове быстро?
Допустим, у вас есть это в какой-то .py файле:
class someClass: pass
print(someClass())
print(someClass())
Вышеприведенные возвращает тот же идентификатор, который сбивает с толку меня, так как я звоню на нее, чтобы она не должна быть такой же, верно? Это как работает python, когда один и тот же класс вызывается дважды подряд или нет? Это дает другой идентификатор, когда я жду несколько секунд, но если я сделаю это так же, как в примере выше, похоже, что это не так, что меня сбивает с толку.
>>> print(someClass());print(someClass())
<__main__.someClass object at 0x0000000002D96F98>
<__main__.someClass object at 0x0000000002D96F98>
Он возвращает то же самое, но почему? Я также замечаю это с диапазонами, например
for i in range(10):
print(someClass())
Есть ли какая-то особая причина для выполнения python при быстром вызове класса? Я даже не знал, что питон сделал это, или это может быть ошибка? Если это не ошибка, кто-нибудь может объяснить мне, как исправить это или метод, чтобы он генерировал другой идентификатор каждый раз, когда вызывается метод/класс? Я довольно озадачен тем, как это происходит, потому что, если я буду ждать, это изменится, но нет, если я попытаюсь назвать тот же класс два или более раз.
Хорошее объяснение, но один незначительный каламбур. То, как оно написано, подразумевает, что на самом деле память получает 'free'd, а затем' malloc'd (или какой-то эквивалент), когда действительно он даже не выходит за пределы открытого списка PyObject Python, и почему это происходит так последовательно (в соответствии с вашими хорошо объясненными оговорками), даже на разных платформах или с отладочными маллоками и т. д. – abarnert
Базовый 'объект'' tp_dealloc' вызывает [тип tp_free 'кучи] (http://hg.python.org/cpython/file/c3896275c0f6/Objects/typeobject.c#l2370), который является [' PyObject_GC_Del'] (http://hg.python.org/cpython/file/c3896275c0f6/Modules/gcmodule.c#l1621). Это, в свою очередь, использует макрос 'PyObject_FREE'. Предостережение относительно того, как скомпилировано CPython, заключается в том, что [без pymalloc] (http://hg.python.org/cpython/file/c3896275c0f6/Include/objimpl.h#l133) макрос 'PyObject_FREE' определяется как' PyMem_FREE ', который для не-отладочной сборки просто« свободен ». Поэтому в этот момент повторное использование адреса зависит от платформы 'malloc'. – eryksun
Хорошо сказано об упоминании коллекции мусора :). – ivanleoncz