Предупреждение о глобальных переменных в Python [повтор]
Я столкнулся с проблемой в своем скрипте на Python 2.6 (да, я знаю, что мне нужно обновиться хотя бы до 2.7). Вот как он выглядит:
ret_code = 0
def some_func():
global ret_code
...
if __name__ == '__main__':
global ret_code
...
Когда я запускаю код, я получаю предупреждение:
SyntaxWarning: name 'ret_code' is assigned to before global declaration global ret_code
.
Почему возникает это предупреждение?
Я решил проблему следующим образом:
def some_func():
global ret_code
...
if __name__ == '__main__':
global ret_code
ret_code = 0 # присваиваю 0 здесь, а не выше
...
Однако это не отвечает на мой вопрос. Что не так с оригинальным кодом?
1 ответ(ов)
Лучший и самый прямой способ исправить это — удалить объявление global
из блока if __name__ == '__main__':
. Вам это не нужно. В отличие от некоторых других языков, оператор if
в Python не создаёт новую область видимости — любые переменные, которые вы присваиваете в этом блоке, являются глобальными, как если бы if
не было.
Это также объясняет, почему возникает ошибка: чтобы объявить переменную как global
, вы не можете использовать это имя переменной ранее в той же области видимости (по всей видимости, это сделано для того, чтобы избежать путаницы из-за того, что команда global
будет присваивать значения до того, как будет обращаться к глобальной переменной, и Python не поддерживает возможность иметь одно и то же имя как глобальное и локальное в одной области видимости). Так как if
не создаёт новую область, первое присвоение ret_code
находится в одной области с объявлением global
, находящимся под if
. Однако объявление global
идет позже, чем присвоение, что не допускается.
Для ещё лучшего решения подумайте, можете ли вы полностью убрать изменяемое глобальное состояние из вашей программы, так как это обычно создает больше проблем, чем стоит. В вашем случае, вероятно, вы используете ret_code
как код выхода программы — то есть, вы вызовете sys.exit(ret_code)
где-то — но принимаете решение внутри функции, какой код выхода использовать. Вместо этого передайте достаточно информации обратно в основной код, чтобы он мог решить, какой код выхода использовать.
TensorFlow Python: Доступ к отдельным элементам в тензоре
Как запустить Python-скрипт аналогично pm2 для Node.js
Скачать видео с YouTube с помощью Python в определённую директорию
Доступ к атрибутам на литералах работает для всех типов, кроме `int`; почему?
Генерация / синтез звука на Python?