Module (76%)
Section (10%)

Внутренняя жизнь списков

Теперь мы хотим показать вам одну важную и очень удивительную особенность списков, которая сильно отличает их от обычных переменных.

Мы хотим, чтобы вы запомнили ее - она может повлиять на Ваши будущие программы и вызвать серьезные проблемы, если будет забыта или упущена из виду.

Взгляните на фрагмент кода в редакторе.

Программа:

  • создает одноэлементный список с именем list_1;
  • присваивает его новому списку с именем list_2;
  • изменяет единственный элемент list_1;
  • выводит list_2.

Удивительно то, что программа выведет: [2], а не [1], что кажется очевидным решением.


Списки (и многие другие сложные объекты Python) хранятся иначе, чем обычные (скалярные) переменные.

Вы можете сказать, что:

  • имя обычной переменной - это имя ее содержимого;
  • имя списка - это имя области памяти, в которой хранится список.

Прочтите эти две строки еще раз - разница важна для понимания того, о чем мы будем говорить дальше.

Присваивание: list_2 = list_1 копирует имя массива, а не его содержимое. Фактически, два имени (list_1 и list_2) идентифицируют одно и то же место в памяти компьютера. Изменение одного из списков влияет на другой, и наоборот.

Что с этим делать?


Code

list_1 = [1]
list_2 = list_1
list_1[0] = 2
print(list_2)
{{ dockerServerErrorMsg }} ×
{{ errorMsg }} ×
{{ successMsg }} ×