Идентификатор объекта
Странное поведение id
, в результате объект функции будет иметь одинаковый идентификатор
def foo():
def bar():
return 1
print(id(bar))
return bar
foo()
foo()
foo()
Но … Если сделать следующие изменения в коде, идентификатор начинает меняться с каждым вызовом функции foo
a = foo()
b = foo()
c = foo()
Почему так происходит, если контекст функции должен удаляться после выполнения?
Ответы (1 шт):
Так происходит потому что при каждом вызове foo()
создаётся (и возвращается) новый объект из функции bar()
Но на изображении видно ещё более странное поведение, чем вы описали. У меня идентификаторы каждый раз менялись, но иногда совпадали с некоторыми из предыдущих (один из них совпал с id
в переменной a
. Почему же так? Всё относительно просто - когда мы вызываем foo()
без её записи в переменную, она может быть удалена и уже недоступна при следующих таких же вызовах. В следующем случае, когда мы сохраняем значение foo()
в переменной (посмотреть id
если что можно при помощи id(a)
, id(b)
и id(c)
соответственно), то тогда и наследующий его объект bar()
сохраняется в переменной, отчего он не удаляется. И тут стоит подчеркнуть, что встроенная система идентификации в Python иногда работает некорректно (вернее корректно, но я данное поведение считаю некорректным), отчего лучше бывает использовать хеширование, например sha-256.