Использование глобальных переменных внутри вложенной функции в Python - PullRequest
3 голосов
/ 10 июля 2020

Я прочитал этот код (приведенный ниже) и понял, что если переменная объявлена ​​глобальной внутри функции и если она изменена, ее значение изменится навсегда .

x = 15
def change(): 
    global x 
    x = x + 5
    print("Value of x inside a function :", x) 
change() 
print("Value of x outside a function :", x)  

Вывод:

Value of x inside a function : 20
Value of x outside a function : 20

Но приведенный ниже код показывает другой вывод. Как так получилось, что значение x не меняется внутри print("After making change: ", x) и остается 15

def add(): 
    x = 15
    
    def change(): 
        global x 
        x = 20
    print("Before making changes: ", x) 
    print("Making change") 
    change() 
    print("After making change: ", x) 

add() 
print("value of x",x) 

Вывод:

Before making changes:  15
Making change
After making change:  15
value of x 20

Ответы [ 3 ]

1 голос
/ 10 июля 2020

В add, x не является глобальной переменной; это локально для add. Вам либо нужно сделать его глобальным, чтобы add и change ссылались на одну и ту же переменную

def add(): 
    <b>global x</b>
    x = 15
    
    def change(): 
        global x 
        x = 20
    print("Before making changes: ", x) 
    print("Making change") 
    change() 
    print("After making change: ", x) 

add() 
print("value of x",x)

, либо вам нужно объявить x в change как нелокальный , а не глобальный.

def add(): 
    x = 15
    
    def change(): 
        <b>nonlocal</b> x 
        x = 20
    print("Before making changes: ", x) 
    print("Making change") 
    change() 
    print("After making change: ", x) 

add() 
print("value of x",x)
1 голос
/ 10 июля 2020

Внутри функции add переменная x присутствует в охватывающей области, а не в глобальной, поэтому ваша переменная x не изменится, даже если вы используете ключевое слово global.
To измените это x вам необходимо ключевое слово nonlocal, которое применяется к переменным, присутствующим в охватывающей области.

Оператор nonlocal заставляет перечисленные идентификаторы ссылаться на ранее связанные переменные в ближайшем охватывающем область, исключая глобальные.

<code>
<b># global scope</b>
x = 0  


def add():
    <b># enclosing scope</b>
    x = 15

    def change():
        <b>nonlocal x</b>
        x = 20

    print("Before making changes: ", x)
    print("Making change")
    change()
    print("After making change: ", x)


add()
print("value of x", x)  # this x is global variable

Вывод:

Before making changes:  15
Making change
After making change:  20
value of x 0
1 голос
/ 10 июля 2020

при определении глобального x в функции change (), вложенной в функцию add (); он определяет основную глобальную переменную x, которая отличается от локальной x = 15 в начале функции add (). когда вы печатаете x до и после вызова change (), вы фактически используете local x = 15 в начале функции add (), но окончательная печать после вызова add () будет использовать определенный глобальный x, который определен в основной области и имеет значение 20

подробнее

...