Кто-нибудь может пояснить за работу неглубокого копирования?
И так, у нас два списка. Это разные списки, потому-что копирование осуществляется через list().
Если я добавляю 100 в скопированный список, то 100 будет только в нем. Если я в скопированном списке меняю элемент, который есть в изначальном, то он меняется везде, в обоих списках.
Но обратите внимание, что при замене 1 элемента в скопированном списке на -500, он не меняется в первом списке.
В чем прикол? Почему поменялся у обоих только элемент, который во вложенном списке?
Ну... надо понимать, что такое указатели в Си. Так объяснить... Просто когда мы меняем значение типа int то мы создаём в куче новый объект и присваиваем его. А когда мы изменяем значение списка, мы просто новый объект помещаем в список вместо старого.
In [1]: addr = lambda o: hex(id(o))
In [2]: first_list = [1, 2, [3, 4]]
In [3]: addr(first_list), [addr(x) for x in first_list]
Out[3]: ('0x1db7075e700', ['0x1db6c4700f0', '0x1db6c470110', '0x1db70775f00'])
In [4]: second_list = list(first_list)
In [5]: addr(second_list), [addr(x) for x in second_list]
Out[5]: ('0x1db70782f00', ['0x1db6c4700f0', '0x1db6c470110', '0x1db70775f00'])
In [6]: second_list.append(100)
In [7]: addr(second_list), [addr(x) for x in second_list]
Out[7]:
('0x1db70782f00',
['0x1db6c4700f0', '0x1db6c470110', '0x1db70775f00', '0x1db6c470d50'])
In [8]: second_list[2][0] = -100
In [9]: addr(first_list), [addr(x) for x in first_list]
Out[9]: ('0x1db7075e700', ['0x1db6c4700f0', '0x1db6c470110', '0x1db70775f00'])
In [10]: addr(second_list), [addr(x) for x in second_list]
Out[10]:
('0x1db70782f00',
['0x1db6c4700f0', '0x1db6c470110', '0x1db70775f00', '0x1db6c470d50'])
In [11]: second_list[1] = -500
In [12]: addr(first_list), [addr(x) for x in first_list]
Out[12]: ('0x1db7075e700', ['0x1db6c4700f0', '0x1db6c470110', '0x1db70775f00'])
In [13]: addr(second_list), [addr(x) for x in second_list]
Out[13]:
('0x1db70782f00',
['0x1db6c4700f0', '0x1db70526c90', '0x1db70775f00', '0x1db6c470d50'])