Доступ к переменной изнутри дважды вложенной функции в Python - PullRequest
5 голосов
/ 18 февраля 2010

следующий код:

x = 0
print "Initialization: ", x
def f1():
    x = 1
    print "In f1 before f2:", x
    def f2():
        global x
        x = 2
        print "In f2:          ", x
    f2()
    print "In f1 after f2: ", x
f1()
print "Final:          ", x

печать:

Initialization:  0
In f1 before f2: 1
In f2:           2
In f1 after f2:  1
Final:           2

Есть ли у f2 способ доступа к переменным f1?

Ответы [ 3 ]

6 голосов
/ 18 февраля 2010

В Python 3 вы можете определить x как нелокальный в f2.

В Python 2 вы не можете напрямую назначить x для f1 в f2.Тем не менее, вы можете прочитать его значение и получить доступ к его членам.Так что это может быть обходной путь:

def f1():
    x = [1]
    def f2():
        x[0] = 2
    f2()
    print x[0]
f1()
6 голосов
/ 18 февраля 2010

Вы можете получить доступ к переменным, проблема в назначении. В Python 2 нет способа перепривязать x к новому значению. Подробнее см. PEP 227 (вложенные области видимости).

В Python 3 вы можете использовать новое ключевое слово nonlocal вместо global. См. PEP 3104 .

0 голосов
/ 18 февраля 2010

удалить global оператор:

>>> x
0
>>> def f1():
    x = 1
    print(x)
    def f2():
        print(x)
    f2()
    print(x)


>>> f1()
1
1
1

если вы хотите изменить переменную x с f1, тогда вам нужно использовать оператор global в каждой функции.

...