Не изменяется a
, потому что вы переопределяете его в функции. Вы в основном делаете это:
def foo(a):
a = [1, 2, 3]
return a
a = []
foo(a)
Таким образом, внешний a
останется пустым списком после вызова функции. Вы можете сказать, но я использую ключевое слово nonlocal
, поэтому я должен ссылаться на исходный a
. Фактически, вы имеете в виду параметр . Таким образом, эффект такой же, как и в приведенном выше коде. Если вы запустите приведенный ниже код с nonlocal
и без него, вы увидите, что происходит:
def foo(a):
def bar():
# nonlocal a
a = [1, 2, 3]
print("bar", a)
bar()
print("foo", a)
a = []
foo(a)
print("global", a)
Выводы:
bar [1, 2, 3]
foo []
global []
И когда вы используете nonlocal a
:
bar [1, 2, 3]
foo [1, 2, 3]
global []
В своей функции вы можете сделать оператор delete nonlocal a
, поскольку он не оказывает никакого влияния на внешний a
и заменить a = []
на a.clear()
.