Внутренняя жизнь списков
Теперь мы хотим показать вам одну важную и очень удивительную особенность списков, которая сильно отличает их от обычных переменных.
Мы хотим, чтобы вы запомнили ее - она может повлиять на Ваши будущие программы и вызвать серьезные проблемы, если будет забыта или упущена из виду.
Взгляните на фрагмент кода в редакторе.
Программа:
- создает одноэлементный список с именем
list_1
; - присваивает его новому списку с именем
list_2
; - изменяет единственный элемент
list_1
; - выводит
list_2
.
Удивительно то, что программа выведет: [2]
, а не [1]
, что кажется очевидным решением.
Списки (и многие другие сложные объекты Python) хранятся иначе, чем обычные (скалярные) переменные.
Вы можете сказать, что:
- имя обычной переменной - это имя ее содержимого;
- имя списка - это имя области памяти, в которой хранится список.
Прочтите эти две строки еще раз - разница важна для понимания того, о чем мы будем говорить дальше.
Присваивание: list_2 = list_1
копирует имя массива, а не его содержимое. Фактически, два имени (list_1
и list_2
) идентифицируют одно и то же место в памяти компьютера. Изменение одного из списков влияет на другой, и наоборот.
Что с этим делать?