Эта проблема не имеет ничего общего с глобальными переменными.Фактически вы можете удалить избыточный оператор global globalEnd
и все еще наблюдать тот же результат.
Проблема в том, что вы не мутируете globalEnd
со строкой globalEnd += 1
.Вы создаете новое целое число со значением globalEnd + 1
и переназначаете имя globalEnd
на это значение.
aList
, в свою очередь, не видоизменяется, поскольку оно все еще содержит ссылки на исходное значениеglobalEnd
.
Поскольку невозможно изменить значение целого числа, вам придется либо непосредственно изменить aList
, либо создать новый список и переназначить имя aList
.Я предлагаю второй вариант.
Демо:
>>> globalEnd = 0
>>>
>>> aList = [0,globalEnd,[0,1,globalEnd]],[[],['l'],globalEnd]
>>>
>>> print(aList)
([0, 0, [0, 1, 0]], [[], ['l'], 0])
>>>
>>> for i in range(10):
... globalEnd += 1
... aList = [0,globalEnd,[0,1,globalEnd]],[[],['l'],globalEnd]
... print(aList)
...
([0, 1, [0, 1, 1]], [[], ['l'], 1])
([0, 2, [0, 1, 2]], [[], ['l'], 2])
([0, 3, [0, 1, 3]], [[], ['l'], 3])
([0, 4, [0, 1, 4]], [[], ['l'], 4])
([0, 5, [0, 1, 5]], [[], ['l'], 5])
([0, 6, [0, 1, 6]], [[], ['l'], 6])
([0, 7, [0, 1, 7]], [[], ['l'], 7])
([0, 8, [0, 1, 8]], [[], ['l'], 8])
([0, 9, [0, 1, 9]], [[], ['l'], 9])
([0, 10, [0, 1, 10]], [[], ['l'], 10])
Я очень рекомендую выступление Неда Батчелдера "Факты и мифы об именах и значениях Python".
Youtube видео
Статья
Факт
Факт: имена переназначаются независимо от других имен.
особенно актуально для вашего вопроса.Если вы переназначаете имя globalEnd
, ссылки в aList
, указывающие на исходное значение, не заботятся.