Подтвердить что ты не робот

Как изменить переменную функции вложенности в вложенной функции

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

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

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

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

4b9b3361

Ответ 1

В 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 состоит в том, чтобы обернуть данные и функциональные возможности в классе, а не использовать закрытие.

Ответ 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/