Я иногда получаю такой способ печати или возврата списка - someList[:]
.
Я не понимаю, почему люди используют его, так как он возвращает полный список.
Почему бы просто не написать someList
, без части [:]
?
Я иногда получаю такой способ печати или возврата списка - someList[:]
.
Я не понимаю, почему люди используют его, так как он возвращает полный список.
Почему бы просто не написать someList
, без части [:]
?
[:]
создает срез, обычно используемый для получения только части списка. Без указателя минимального/максимального значения он создает копию всего списка. Здесь показан сеанс 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
является копией.
В 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% быстрее, чем метод среза!
Чтобы создать копию списка вместо передачи по ссылке, как это делает 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
Когда вам нужно изменить список, и вы не хотите изменять список и создавать другой список, вы используете
y = [1,2,3]
x = y[:]
и вы можете сделать много изменений в списке, но список происхождения будет в (y) и изменен в (x)