Подтвердить что ты не робот

Что делает эта нотация для списков в Python: "someList [:]"?

Я иногда получаю такой способ печати или возврата списка - someList[:]. Я не понимаю, почему люди используют его, так как он возвращает полный список.

Почему бы просто не написать someList, без части [:]?

4b9b3361

Ответ 1

[:] создает срез, обычно используемый для получения только части списка. Без указателя минимального/максимального значения он создает копию всего списка. Здесь показан сеанс Python:

>>> a = [1,2,3]
>>> b1 = a
>>> b2 = a[:]
>>> b1.append(50)
>>> b2.append(51)
>>> a
[1, 2, 3, 50]
>>> b1
[1, 2, 3, 50]
>>> b2
[1, 2, 3, 51]

Обратите внимание, что добавление к b1 также добавило значение к a. Однако добавление к b2 не изменяло a, т.е. b2 является копией.

Ответ 2

В python, когда вы выполняете a = b, a не принимает значение b, а ссылается на то же значение, на которое ссылается b. Чтобы увидеть это, сделайте:

>>> a = {'Test': 42}
>>> b = a
>>> b['Test'] = 24

Теперь значение a?

>>> a['Test']
24

Это похоже на списки, поэтому мы должны найти способ действительно скопировать список, а не ссылаться на него. Один из способов - воссоздать список copy = list(list1) или использовать функции модуля copy. Но, в конце концов, самый простой способ, самый лучший, лучший способ (;)) для этого - скопировать каждое значение первого списка в другой, выполнив copy = list1[:]. Он использует срезы, здесь list1 вырезано из индекса 0 в индекс len (list1), поэтому возвращается весь список1!

Кроме того, метод slice немного быстрее: с помощью метода time.clock() для измерения среднего времени выполнения 1000 присваивания списков, каждый из которых содержит 10000 случайных целых чисел, с фрагментами, конструктором и глубокой копией, результаты показывают, что срезы на 15% быстрее, чем метод конструктора, а глубокая копия в 4 раза медленнее. Однако это увеличение времени незначительно при использовании небольших списков: таким образом, использование copy = list(list_to_copy) или copy = list_to_copy[:] зависит от предпочтений разработчика.

Наконец, мы часто забываем метод list.copy, который, кажется, быстрее! Фактически, это даже на 13% быстрее, чем метод среза!

Ответ 3

Чтобы создать копию списка вместо передачи по ссылке, как это делает Python. Используйте следующий два примера, чтобы понять разницу.

Пример:

# Passing by reference
SomeListA = [1, 2, 3]
SomeListB = [2, 3, 4]
SomeListB = SomeListA
SomeListA[2] = 5
print SomeListB
print SomeListA

# Using slice
SomeListA = [1, 2, 3]
SomeListB = [2, 3, 4]
SomeListB = SomeListA[:]
SomeListA[2] = 5
print SomeListB
print SomeListA

Ответ 4

Когда вам нужно изменить список, и вы не хотите изменять список и создавать другой список, вы используете

y = [1,2,3]
x = y[:]

и вы можете сделать много изменений в списке, но список происхождения будет в (y) и изменен в (x)