Глобальный и локальный охват в Python - PullRequest
0 голосов
/ 18 июня 2019

Просто вопрос для начинающих о локальной и глобальной области видимости в python

X = 100
#is X a global variable?.We defined it outside the function scope
def foo():
    print(X)
    return X
#it prints 100 and even returns it
def foo():
    X = X + 10
#local error
#UnboundLocalError: local variable 'X' referenced before assignment
def foo():
    global X
    # if X is a global variable why specify again?
    X = X + 10
    return X

Ответы [ 3 ]

3 голосов
/ 18 июня 2019

Чтобы изменить глобальную копию переменной, вам нужно использовать ключевое слово global, но вам не нужно global, если вы только обращаетесь к нему.

2 голосов
/ 18 июня 2019

с сайта python :

В Python переменные, на которые ссылаются только внутри функции, неявно являются глобальными. Если переменной назначено значение где-либо в теле функции, оно считается локальным, если явно не объявлено как глобальное.

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

1 голос
/ 18 июня 2019

global и nonlocal очень странные вещи, когда я был новичком.

Подумайте только: зачем они нам нужны в Python?

Это потому, что мы не понимаемДля объявления переменных не требуется var, let и тому подобные вещи.

Подумайте о Javascript, это тоже динамический язык сценариев и очень похож на python, но ему нужны var или let или const для объявления переменных.

Самая важная вещь для объявления переменных - это определение области действия.

Итак, в Python наши переменные имеют неявную область по умолчанию: currentобласть видимости, где они определены, и если мы хотим изменить область видимости некоторых переменных, нам необходимо явно использовать global или nonlocal.

Все имена в левой части = означаютопределить переменные.

Перед выполнением кода некоторой определенной области, Python предварительно вычислит все local variables, которые находятся в левой части =. Вот почему вы получили UnboundLocalError: local variable 'X' referenced before assignment in:

def foo():
    X = X + 10

Итак, если мы ищем эти имена не в определенной текущей области, просто следуйте правилам цепочки областей действия: вверх, вверх, до и до built_in.

Помните : область любого имени в левой части = является текущей областью по умолчанию, и вам необходимо назначить ее (связать с ней что-нибудь)) перед тем, как отсылать его.

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