Как @Alex Martelli указал, что ваш код, показанный на рисунке, не приводит к ошибке, но, отложив ее на время до ответа @ cobbal (извините, я пока не могу комментировать), вы должны быть очень осторожными когда дело доходит до области действия
В ответе @ cobbal:
def test1():
M = [1]
создает новую переменную M
, локальную для функции test1
.Однако, если бы вместо выполнения присваивания M = [1]
он использовал M.append(1)
, как это было сделано в вопросе, вместо создания новой локальной переменной Python выглядел бы из локальной области видимости функции в более высокие области, в этомcase глобальная область действия, где действительно уже есть переменная M
, которая указывает на пустой список.В этом случае Python найдет эту переменную и просто добавит к существующему списку, в результате чего глобальный M
теперь будет указывать на [1]
.
Во втором примере:
def test2():
global M
M = [2]
Использованиеключевого слова global
важно, чтобы избежать локального присваивания, которое могло бы произойти.Вызвав global
использование M
в локальной области действия функции, вы укажете на уже существующий объект []
вне функции.
Вы можете доказать это себе, вставив id(M)
вразличные формы функции, чтобы показать, какие реализации заставляют M
внутри функции указывать на глобальный или локальный объект.