Правильное использование глобальных переменных в Python 3
Какое правильное использование глобальных переменных в Python 3?:
1) Указав global VAR_NAME
один раз в ядре script (не внутри функции), а затем просто ссылаясь на переменную как VAR_NAME
всюду
2) Оповещать global VAR_NAME
один раз внутри каждой функции, которая использует глобальную переменную, а затем просто ссылается на переменную как VAR_NAME
для остальной части функции и внутри самого ядра script
Ответы
Ответ 1
В первом случае глобальное ключевое слово не имеет смысла, так что это не правильно. Определение переменной на уровне модуля делает ее глобальной переменной, вам не нужно ключевое слово global.
Второй пример - правильное использование.
Тем не менее, наиболее распространенное использование глобальных переменных без использования глобального ключевого слова. Ключевое слово global необходимо, только если вы хотите переназначить глобальные переменные в функции/методе.
Ответ 2
Вам нужно использовать ключевое слово global в функции, если вы используете глобальную переменную таким образом, чтобы иначе интерпретироваться как назначение локальной переменной. Без ключевого слова 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 an attempt to reference a local variable that has not been declared.
global_var += 1
Ответ 3
"таким образом, который иначе интерпретируется как присвоение локальной переменной" --- да, но вот тонкая деталь:
------------------- ошибка: локальная переменная '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)
Ответ 4
Основное различие между первыми двумя случаями и следующими двумя случаями в приведенном выше ответе должно заключаться в том, что список изменчив. Для случаев, таких как a = 1, указатель указывает на то место, где находится 1, а когда вы говорите, что a = 2, указатель смещается.
Для случая изменяемых объектов выделяется место в памяти, и когда используются такие методы, как append, происходят изменения в самой ячейке памяти, поэтому значение изменяемых ссылок изменяется глобально.
Теперь большой вопрос в том, как функция знает, что переменная, которую мы модифицируем, является глобальной или локальной, потому что кажется, что мы можем изменить глобальную переменную, если она изменяемая, и не можем, если она не изменяемая (функция также не распознает эту переменную). в качестве глобальной переменной)