Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2015 20:56:23

setevoy
От: Kiev, UA
Зарегистрирован: 2013-02-22
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

python function closures

Добрый день.

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

Статья.

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, со всем её пространством имён и переменными?

Отредактировано setevoy (Июнь 1, 2015 20:56:56)

Офлайн

#2 Июнь 2, 2015 01:01:27

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10031
Репутация: +  857  -
Профиль   Отправить e-mail  

python function closures

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

Пока inner(), захватившая x, привязана к чему-то, переменная x не будет освобождена.
А сама inner() тоже находится в outer(). В том-то и прикол, что ты держишь эту inner(), а inner() держит x.



Отредактировано py.user.next (Июнь 2, 2015 01:10:34)

Офлайн

#3 Июнь 2, 2015 07:57:13

setevoy
От: Kiev, UA
Зарегистрирован: 2013-02-22
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

python function closures

Спасибо. То, что надо.

Отредактировано setevoy (Июнь 2, 2015 07:57:28)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version