Найти - Пользователи
Полная версия: python function closures
Начало » Python для новичков » python function closures
1
setevoy
Добрый день.

Читаю статью по декораторам, и наткнулся на одним не совсем понятный момент… Подскажите, пожалуйста.

Статья.

8 часть, имеется код:

>>> def outer():
...     x = 1
...     def inner():
...         print x # 1
...     return inner
>>> foo = outer()
>>> foo.func_closure # doctest: +ELLIPSIS
(<cell at 0x...: int object at 0x...>,)

Далее - идёт объяснение, почему он не должен бы сработать (но - да, он работает):

> We aren’t able to call inner till after the return of outer so according to our model of how Python works, x shouldn’t exist anymore by the time we call inner and perhaps a runtime error of some kind should occur.

Но - почему `We aren't`, если мы сохранили outer() в foo, со всем её пространством имён и переменными?
py.user.next
setevoy
Но - почему `We aren't`, если мы сохранили outer() в foo, со всем её пространством имён и переменными?
Он имеет в виду, что переменная x существует во время выполнения outer() и разрушается при выходе из outer(). Но она не уничтожена, хотя outer() и завершила работу. И дальше он вводит понятие замыкания.

Пока inner(), захватившая x, привязана к чему-то, переменная x не будет освобождена.
А сама inner() тоже находится в outer(). В том-то и прикол, что ты держишь эту inner(), а inner() держит x.
setevoy
Спасибо. То, что надо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB