предупреждение глобальной переменной в python [дубликат]

этот вопрос уже есть ответ здесь:

у меня есть скрипт python 2.6 (да, я знаю, что должен обновиться до по крайней мере 2.7), который выглядит так:

ret_code = 0

def some_func()
  global ret_code
  ...

if __name__ == '__main__':
  global ret_code
  ...

теперь я получаю предупреждение, когда я запускаю код: *SyntaxWarning: имя 'ret_code' присваивается до глобальной декларации global ret_code*

почему я получаю это предупреждение?

Я могу решить проблему таким образом:

def some_func()
      global ret_code
      ...

if __name__ == '__main__':
  global ret_code
  ret_code = 0 #assign 0 here instead of above
  ...

все-таки это не ответ на мой вопрос. Что не так с исходным кодом?

1 ответов


лучший прямой способ исправить это-удалить global декларации из-под if __name__ == '__main__':. Тебе там не нужно. В отличие от некоторых других языков,if оператор не вводит новую область в Python - любые переменные, которые вы назначаете в этом блоке, являются глобальными, как и без if там.

это также объясняет, почему это ошибка: объявить переменную как global, вам не разрешено использовать имя переменной ранее в том же область (предположительно, потому что это было бы запутанным для global заявление для выполнения заданий до он переходит к глобальной переменной, и Python не поддерживает одно и то же имя, являющееся как глобальным, так и локальным в одной области). С if не вводит новую область, первое назначение ret_code находится в той же области, что и глобальная декларация под if; но глобальное объявление приходит позже, чем назначение, которое не разрешено.

для еще лучше исправить, подумайте, можете ли вы полностью удалить изменяемое глобальное состояние из своей программы, поскольку оно обычно вызывает больше проблем, чем его ценность где-то в будущем. Здесь кажется вероятным, что вы используете ret_code как код выхода программы-ie, вы будете делать sys.exit(ret_code) где-то-но вы решаете внутри функции, какой код выхода использовать. Вместо этого передайте достаточное количество информации обратно в код верхнего уровня для это чтобы решить, какой код выхода использовать.