2013-12-10 3 views
2

Так до сих пор я не был в предположении, что если у вас есть, например:python: мутация копии списка изменяет оригинал?

L = [1,2,3] 
L2 = L1 
L2.append(5) 

как L и L2 будет зависеть от кода добавления.

однако при назначении L2 быть копией списка, например:

L = [1,2,3] 
L2 = L[:] 
L2.append(5) 

только L2 будет затронута, и L-прежнему относится к [1,2,3]

но теперь я сталкиваюсь с этим:

x = [1, 2] 
L1 = [x, [8, 9]] 
L2 = L1[:] 
L2[0][1] = 999 

>>>print(L1) 
[[1,999],[8,9]] 
>>>print(L2) 
[[1,999],[8,9]] 

Почему было так, что в этом случае оба списка изменены?

ответ

5

Нарезка мелкой копии. Копия, созданная срезом, будет содержать новые ссылки на старые элементы исходного списка; если исходный список содержит изменяемые объекты, такие как больше списков, копия будет содержать ссылки на те же самые списки. Вы можете использовать copy.deepcopy, чтобы попытаться обойти это, или прокрутите свой исходный список, а фрагмент - скопируйте элементы в новый список. Будьте осторожны с copy.deepcopy; часто есть некоторая глубина, на которой вы хотите прекратить делать копии и сохранять исходные элементы.

Смежные вопросы