Как изменить переменную функции вложенности в вложенной функции
Я хочу, чтобы переменная, определенная в функции вложенности, изменялась во вложенной функции, что-то вроде
def nesting():
count = 0
def nested():
count += 1
for i in range(10):
nested()
print count
Когда вызывается функция вложенности, я хочу, чтобы она печатала 10, но она вызывает UnboundLocalError. Ключевое слово global может решить это. Но поскольку количество переменных используется только в области функции вложенности, я ожидаю, что не объявим его глобальным. Каков хороший способ сделать это?
Ответы
Ответ 1
В Python 3.x вы можете использовать объявление nonlocal
(в nested
), чтобы сообщить Python, что вы хотите назначить переменной count
в nesting
.
В Python 2.x вы просто не можете назначить count
в nesting
из nested
. Однако вы можете обойти это, не присваивая самой переменной, но используя изменяемый контейнер:
def nesting():
count = [0]
def nested():
count[0] += 1
for i in range(10):
nested()
print count[0]
Хотя для нетривиальных случаев обычный подход Python состоит в том, чтобы обернуть данные и функциональные возможности в классе, а не использовать закрытие.
Ответ 2
Немного поздно, вы можете прикрепить атрибут к функции "вложенности" следующим образом:
def nesting():
def nested():
nested.count += 1
nested.count = 0
for i in range(10):
nested()
return nested
c = nesting()
print(c.count)
Ответ 3
Самый элегантный подход для меня: работает на 100% на обеих версиях python.
def ex8():
ex8.var = 'foo'
def inner():
ex8.var = 'bar'
print 'inside inner, ex8.var is ', ex8.var
inner()
print 'inside outer function, ex8.var is ', ex8.var
ex8()
inside inner, ex8.var is bar
inside outer function, ex8.var is bar
Подробнее: http://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/