Правильное использование глобальных переменных в Python 3 - PullRequest
35 голосов
/ 20 февраля 2012

Как правильно использовать глобальные переменные в Python 3?:

1) Указание global VAR_NAME один раз в базовом скрипте (не в функции), а затем просто обращение к переменной как VAR_NAME везде

2) Указание global VAR_NAME один раз в каждой функции, которая использует глобальную переменную, а затем просто ссылка на переменную как VAR_NAME для остальной части функции и внутри самого скрипта ядра

Ответы [ 4 ]

51 голосов
/ 20 февраля 2012

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

Второй пример - правильное использование.

Тем не менее, наиболее распространенное использование глобальных переменных - без использования ключевого слова global. Ключевое слово global необходимо, только если вы хотите переназначить глобальные переменные в функции / методе.

40 голосов
/ 20 февраля 2012

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

Вот несколько примеров:

global_var = 1

def example1():
    # global keyword is not needed, local_var will be set to 1.
    local_var = global_var

def example2():
    # global keyword is needed, if you want to set global_var,
    # otherwise you will create a local variable.
    global_var = 2

def example3():
    # Without using the global keyword, this is an error.
    # It's an attempt to reference a local variable that has not been declared.
    global_var += 1
6 голосов
/ 07 сентября 2016

"способом, который иначе интерпретировался бы как присвоение локальной переменной" --- да, но здесь есть тонкая деталь:

------------------- ошибка: локальная переменная 'c' указана перед присваиванием

def work():
  c += 3

c = 0

work()
print(c)

------------------- ошибка: локальная переменная 'c 'ссылка перед присвоением

c = 0

def work():
  c += 3

work()
print(c)

------------------- печать [3]

def work():
  c.append(3)

c = []

work()
print(c)

------------------- печать [3]

c = []

def work():
  c.append(3)

work()
print(c)
1 голос
/ 01 мая 2019

Основное различие между первыми двумя случаями и следующими двумя случаями в приведенном выше ответе должно заключаться в том, что список изменчив. Для случаев, таких как a = 1, указатель указывает на то место, где находится 1, а когда вы говорите, что a = 2, указатель смещается.

Для случая изменяемых объектов выделяется место в памяти, и при использовании таких методов, как append, в самой ячейке памяти происходят изменения, поэтому значение изменяемых ссылок изменяется глобально.

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

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