[Код в оригинальной версии был сильно перепутан. Даже после того, как я исправил код, в посте осталось несколько очень запутанных опечаток. Я считаю, что я, наконец, исправил их все тоже. Примите искренние извинения.]
Два приведенных ниже вызова alias
дают разные результаты, потому что объект, связанный с переменной my_own_id
, изменяется между двумя вызовами:
>>> def my_own_id():
... me = my_own_id
... return id(me)
...
>>> alias = my_own_id
>>> alias()
4301701560
>>> my_own_id = None
>>> alias()
4296513024
Что я могу присвоить me
в определении my_own_id
, чтобы его вывод оставался инвариантным по отношению к последующим переопределениям переменной my_own_id
? (IOW, чтобы внутренняя переменная me
всегда ссылалась на один и тот же объект функции?)
(Я могу получить текущий кадр (с inspect.currentframe()
), но он содержит только ссылку на текущий объект кода, а не на текущую функцию.)
P.S. Мотивация для этого вопроса заключается только в том, чтобы лучше узнать Python.
spam
? - person Martijn Pieters   schedule 10.08.2012ham
иspam
ссылками наmy_own_id()
? - person voithos   schedule 10.08.2012foo = ham; ham(); del ham; foo()
(что, я полагаю, является ответом на ваши вопросы, хотя и без какого-либо понимания :-) - person thebjorn   schedule 10.08.2012>>> id(my_own_id) 45375408 >>> alias = my_own_id >>> id(alias) 45375408 >>> my_own_id = None >>> id(my_own_id) 505354444 >>> id(alias) 45375408 >>> alias() 505354444
- person jamylak   schedule 10.08.2012alias()
— это идентификаторNone
, т. е. каков идентификатор объекта, к которому привязано имя «my_own_id»? - person Russell Borogove   schedule 11.08.2012