Идентификатор объекта

Странное поведение id , в результате объект функции будет иметь одинаковый идентификатор

def foo():
    def bar():
        return 1
    print(id(bar))
    return bar
foo()
foo()
foo()

Но … Если сделать следующие изменения в коде, идентификатор начинает меняться с каждым вызовом функции foo

a = foo()
b = foo()
c = foo()

Почему так происходит, если контекст функции должен удаляться после выполнения?


Ответы (1 шт):

Автор решения: OlegXio

Так происходит потому что при каждом вызове foo() создаётся (и возвращается) новый объект из функции bar()

Скриншот консоли

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

→ Ссылка