Как изменить переменную вложенной функции во вложенной функции - PullRequest
16 голосов
/ 01 июня 2011

Я бы хотел, чтобы переменная, определенная во вложенной функции, изменялась во вложенной функции, что-то вроде

def nesting():
    count = 0
    def nested():
        count += 1

    for i in range(10):
        nested()
    print count

Когда вызывается вложенная функция, я хочу, чтобы она печатала 10, но она вызывает UnboundLocalError,Ключевое слово global может решить эту проблему.Но поскольку переменная count используется только в области вложенности, я не буду объявлять ее глобальной.Каков хороший способ сделать это?

Ответы [ 3 ]

21 голосов
/ 01 июня 2011

В Python 3.x вы можете использовать объявление nonlocalnested), чтобы сообщить 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 заключается в переноседанные и функциональность в классе, а не с использованием замыканий.

5 голосов
/ 04 октября 2014

Немного поздно, вы можете прикрепить атрибут к «вложенной» функции следующим образом:

def nesting():

    def nested():
        nested.count += 1
    nested.count = 0

    for i in range(10):
        nested()
    return nested

c = nesting()
print(c.count)
0 голосов
/ 16 сентября 2016

Самый элегантный подход для меня: 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/

...