Нужно ли определять глобальную переменную, используемую в функции, перед блоком def? - PullRequest
1 голос
/ 24 февраля 2020

Я должен признать, что не ожидал, что следующий код может работать (пример кода из моей коллеги):

def foo():
    li.append(3)
li = [1, 2]
foo()
print(li) # gives [1, 2, 3]

Мои вопросы:

  • почему «global li» не требуется в «def foo ()»?
  • почему «li = [1, 2]» не нужно ставить перед «def foo ()»?

пс. Python 3.6.1 используется для приведенного примера кода.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020
  1. Глобальное ключевое слово - это ключевое слово, которое позволяет пользователю изменять переменную вне текущей области.

    Правила глобального ключевого слова:

    • Если Переменной присваивается значение в любом месте тела функции, оно считается локальным, если явно не объявлено как глобальное.
    • Переменные, на которые есть ссылки только внутри функции, являются
      неявно глобальными.
    • Мы используем ключевое слово global для использования глобальной переменной внутри функции.
    • Нет необходимости использовать ключевое слово global вне функции.

Ваш код, вы не изменяете или не присваиваете значение 'li'

2. Список задан до вызова foo (), поэтому он работает нормально. Предположим, что вы вызываете foo () до того, как li определено, это вызовет ошибку как NameError: имя 'li' не определено

1 голос
/ 24 февраля 2020
  1. Поскольку список определен до вызова foo (), следовательно, ошибки нет.
  2. global Ключевое слово требуется только тогда, когда мы хотим выполнить присваивание или изменить глобальную переменную. Для доступа к методам или печати переменной не требуется ключевое слово global
...