Странное поведение python

from collections import deque
a = [[5, 5], [6, 6], [7, 7]]
a.append(a[-1])
a[-1][0] += 1
print(a)

Данный код выводит [[5, 5], [6, 6], [8, 7], [8, 7]], хотя я ожидаю [[5, 5], [6, 6], [7, 7], [8, 7]]. Почему питон вместо создания новой ячейки памяти работает с ссылкой и как этого избежать?


Ответы (1 шт):

Автор решения: Андрей Коробейников

Это вполне нормальное поведение изменяемых типов в python. Конкретно в вашем примере достаточно использовать срез списка что бы избежать создания ссылки на тот же объект, и вместо этого создать новый объект.

a = [[5, 5], [6, 6], [7, 7]]
a.append(a[-1][:])
a[-1][0] += 1
# или
a.append(a[-1]*1)
# или
a.append(a[-1].copy())
print(a)

Так же у списков, словарей, множеств есть метод copy(), который создаёт копию объекта.

→ Ссылка