Глобальные пространства имен Python и порядок оценки - PullRequest
1 голос
/ 31 октября 2011

Попробуйте это:

A = 1
B = 2
C = A + B

def main():
    global C
    print A

Выход main() равен 1.

Почему это? Почему main должен узнать о других глобальных переменных, используемых для оценки C?

Ответы [ 2 ]

8 голосов
/ 31 октября 2011

Глобальные переменные всегда доступны для всех локальных областей в Python, включая функции. В этом случае в пределах main() A, B и C все находятся в области действия.

Ключевое слово global не делает то, что, как вы думаете, делает; скорее, он позволяет локальной области видимости манипулировать глобальной функцией (это делает, так сказать, глобальные переменные «доступными для записи»). Рассмотрим эти примеры:

c = 4
print c
def foo():
    c = 3
    print c
foo()
print c

Здесь вывод будет

4
3
4

Теперь рассмотрим это:

c = 4
print c
def foo():
    global c
    c = 3
    print c
foo()
print c

В этом случае вывод будет

4
3
3

В первом случае c = 3 просто затеняет c до тех пор, пока его область не будет увеличена (т.е. когда определение функции закончится). Во втором случае мы фактически ссылаемся на глобальную c после того, как напишем global c, поэтому изменение значения c приведет к постоянному изменению.

4 голосов
/ 31 октября 2011

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

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