Что, если есть, есть разница между list
и list[:]
в python?
В чем разница между списком и списком [:] в python?
Ответ 1
При чтении list
является ссылкой на исходный список, а list[:]
неглубоко копирует список.
При назначении list
(re) связывает имя и list[:]
slice-assigns, заменяя предыдущее в списке.
Кроме того, не используйте list
в качестве имени, поскольку оно затеняет встроенный.
Ответ 2
Последний - ссылка на копию списка, а не ссылку на список. Так что это очень полезно.
>>> li = [1,2,3]
>>> li2 = li
>>> li3 = li[:]
>>> li2[0] = 0
>>> li
[0, 2, 3]
>>> li3
[1, 2, 3]
Ответ 3
Однако, если элементы списка сами представляют собой списки, даже list1 = list[:]
имеет свои проблемы. Рассмотрим:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 3], [4, 5, 6], [7, 8, 9]]
Это происходит потому, что каждый элемент списка, скопированный в b, является самим списком, и это копирование списков включает ту же проблему, что и с обычным list1 = list2
.
Самый короткий путь , который я нашел, заключается в том, чтобы явно скопировать каждый элемент списка таким образом:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b=[[j for j in i] for i in a]
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Конечно, для каждой дополнительной степени вложенности во вложенном списке код копирования увеличивается с помощью дополнительного встроенного цикла for
.
Ответ 4
Чтобы применить первый list
к переменной, вы создадите ссылку на исходный список.
Второй list[i]
создаст мелкую копию.
например:
foo = [1,2,3]
bar = foo
foo[0] = 4
bar и foo теперь будут:
[4,2,3]
а
foo = [1,2,3]
bar = foo[:]
foo[0] = 4
Результатом будет:
bar == [1,2,3]
foo == [4,2,3]
:
- срез.
Ответ 5
li [:] создает копию исходного списка. Но это не относится к одному и тому же объекту списка. Следовательно, вы не рискуете изменить исходный список, изменив копию, созданную ли [:].
например:
>>> list1 = [1,2,3]
>>> list2 = list1
>>> list3 = list1[:]
>>> list1[0] = 4
>>> list2
[4, 2, 3]
>>> list3
[1, 2, 3]
Здесь list2
изменяется путем изменения list1
, но list3
не изменяется.