У меня есть это:Адрес лямбда-функции в Python
>>> a = lambda : lambda x : x * x
Это дает мне постоянные адреса при каждом:
>>> a
<function <lambda> at 0x7f22769e76e0>
>>> a
<function <lambda> at 0x7f22769e76e0>
>>> a
<function <lambda> at 0x7f22769e76e0>
Однако это не делает. Почему так? Также обратите внимание, что это дает только два адреса? Почему так? Является ли внутренняя лямбда-функция создаваемой на лету и возвращается каждый раз при вызове a()
? Разве это не было создано, когда было объявлено?
>>> a()
<function <lambda> at 0x7f22769e7320>
>>> a()
<function <lambda> at 0x7f22769e75f0>
>>> a()
<function <lambda> at 0x7f22769e7320>
>>> a()
<function <lambda> at 0x7f22769e75f0>
Я предполагаю, что часть двух адресов связана с специальной переменной '_', созданной для хранения результата предыдущего вычисления в интерактивном сеансе. Поскольку есть ссылка на него, возвращаемое значение (которое вы видите 'repr' of) получает только мусор, собранный после выполнения второго оператора (заменяя ссылку в' _'). В неинтерактивном скрипте вы можете получить один и тот же адрес для всех из них (хотя, вероятно, это не тот же объект, а просто повторно используемая память). – Blckknght
@Blckknght Вы правы - я протестировал его, и в скрипте адрес тот же, хотя я все еще очень смущен о том, почему. Можете ли вы предоставить ссылку с дополнительной информацией или дать более подробный ответ? –
Интересно, 'print a()' не имеет такого же поведения – Aert