В чем разница между list и list [:] в python? - PullRequest
46 голосов
/ 02 ноября 2010

В чем разница между list и list[:] в python?

Ответы [ 6 ]

71 голосов
/ 02 ноября 2010

При чтении list является ссылкой на исходный список, а list[:] мелко копирует список.

При назначении list (re) связывает имя и list[:] слайс-assigns, заменяя то, что было ранее в списке.

Кроме того, не используйте list в качестве имени, поскольку оно скрывает встроенное.

22 голосов
/ 02 ноября 2010

Последний является ссылкой на копию списка, а не ссылкой на список.Так что это очень полезно.

>>> li = [1,2,3]
>>> li2 = li
>>> li3 = li[:]
>>> li2[0] = 0
>>> li
[0, 2, 3]
>>> li3
[1, 2, 3]
3 голосов
/ 09 июля 2012

li [:] создает копию исходного списка.Но это не относится к тому же объекту списка.Следовательно, вы не рискуете изменить исходный список, изменив копию, созданную li [:].

, например:

>>> list1 = [1,2,3]
>>> list2 = list1
>>> list3 = list1[:]
>>> list1[0] = 4
>>> list2
[4, 2, 3]
>>> list3
[1, 2, 3]

Здесь list2 изменяется при изменении list1но list3 не меняется.

3 голосов
/ 30 апреля 2011

Однако, если элементы списка сами являются списками, даже у 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.

3 голосов
/ 02 ноября 2010

Чтобы применить первый 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]

: нарезать.

1 голос
/ 03 июля 2018

Первая ссылка на оригинальный список.Второй указывает на копию исходного списка.
Проверьте это!

>>> a = [1, 2, 3]
>>> b = a
>>> c = a[:]
>>> a == b
True
>>> a is b
True
>>> a == c
True
>>> a is c
False
>>> a.__repr__
<method-wrapper '__repr__' of list object at 0x7f87a9ba3688>
>>> a.__repr__()
'[1, 2, 3]'
>>> b.__repr__
<method-wrapper '__repr__' of list object at 0x7f87a9ba3688>
>>> c.__repr__
<method-wrapper '__repr__' of list object at 0x7f87ad352988>

Обратите внимание, что оба пункта a и b по адресу 0x7f87a9ba3688 , тогда как c указывает на 0x7f87ad352988 .
Разница кристально ясна.
Оба a и b ссылка на исходный объект списка.
Принимая во внимание, что c указывает на копию (исходного списка) и, таким образом, находится в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...