Если один список является вложенным в другой, то этого списка, через переменную, повлечет за собой его изменение в том списке, куда он был вложен. Во второй строке кода в b
записывается не значение, связанное с a
, а ссылка. В результате на список [1, 2, 3, 4, 5]
ссылаются из двух мест: из a
и из b[2]
. Изменять этот список можно через любую ссылку.
>>> a = [1, 2, 3, 4, 5]
>>> b = [10, 20, a, 30, 40]
>>> a.append(6)
>>> b
[10, 20, [1, 2, 3, 4, 5, 6], 30, 40]
>>> b[2][0:0] = [0]
>>> a
[0, 1, 2, 3, 4, 5, 6]
Если требуется вложить в список копию другого списка, то можно сначала взять срез от начала до конца списка. Операция среза копирует данные.
>>> a = [1, 2, 3, 4, 5]
>>> b = [10, 20, a[:], 30, 40]
>>> b
[10, 20, [1, 2, 3, 4, 5], 30, 40]
>>> a.append(6)
>>> b
[10, 20, [1, 2, 3, 4, 5], 30, 40]
Еще пример присваивания ссылки на данные, а не копии данных. Это особенность списков и словарей в языке Python.
>>> b
[10, 20, [1, 2, 3, 4, 5, 6], 30, 40]
>>> c = b
>>> del b[0]
>>> b
[20, [1, 2, 3, 4, 5, 6], 30, 40]
>>> c
[20, [1, 2, 3, 4, 5, 6], 30, 40]
Вышеописанное не касается таких случаев:
>>> a = [1, 2, 3, 4, 5]
>>> b = [10, 20]
>>> c = a + b
>>> c
[1, 2, 3, 4, 5, 10, 20]
>>> a[0] = 100
>>> c
[1, 2, 3, 4, 5, 10, 20]
>>> a
[100, 2, 3, 4, 5]
Здесь a
и b
уже никак не связаны c переменной c
. Результат сложения списков записывается в отдельную область памяти.