Как нелокальный и глобальный Python работают вместе? - PullRequest
0 голосов
/ 03 октября 2018

Это мой пример

x=0
def outer():
    x = 1
    def i1():
        nonlocal x
        x = 2
        print("inner1:", x)

    i1()
    print("outer:", x)

    def i2():
        nonlocal x
        x = 3
        print("inner2:", x)

    i2()
    print("outer:", x)

    def i3():
        global x
        print("inner3:", x)

    i3()
    print("outer:", x)

outer()
print("global:", x)

Вывод в моем Jupyter

inner1: 2
outer: 2
inner2: 3
outer: 3
inner3: 0
outer: 3
global: 0

Почему внешний имеет значение 0?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

В i3(), когда вы объявляете global x, он действительно использует самый внешний x, но вы не изменили его значение.

В этой части кода:

i3()
print("outer:", x)

Команда print находится вне метода i3(), поэтому глобальный x равен NOT используемый.Это будет локальный x, который будет использоваться.Команда global в i3() означает, что только x, используемый в i3(), будет глобальным.Как только выйдет за пределы i3(), объявленная область действия global для x будет завершена.

Таким образом, print("outer:", x) печатает 3, что является значением локальной переменной метода outer().Самый внешний x остается 0 на всем протяжении.

0 голосов
/ 03 октября 2018

Я думаю, что в вашем тестовом примере есть ошибка.Если я изменю i3 на:

    def i3():
        global x
        x = "i3"
        print("inner3:", x)

, тогда я получу

global: i3

в конце, как я и ожидал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...