Это немного неясно, но здесь есть причина для этого: при компиляции функции Python просматривает все используемые там имена и определяет, из какой области они приходят. Имена, которым не назначены, будут использовать внешнюю область (глобальную или нелокальную), имена, которым присвоено , являются локальными. Поскольку aa += 1
считается присваиванием, оно помечает aa
как локальную переменную.
Хотя следующая строка выглядит аналогично, она делает что-то другое: нигде вы не присваиваете что-то имени bb
. Вы извлекаете что-то из нелокального / глобального имени (списка), а затем присваиваете элементу этого элемента.
Это можно исправить, явно пометив aa
как нелокальное или глобальное:
def bbtest():
global aa
aa += 1
bb[0] += 1
С другой стороны, вы можете прервать дело bb
, присвоив имя, даже после этого :
def bbtest():
bb[0] += 1
bb = "foo"