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

Каков наилучший способ скопировать список?

Каков наилучший способ скопировать список? Я знаю следующие способы, какой из них лучше? Или есть другой способ?

lst = ['one', 2, 3]

lst1 = list(lst)

lst2 = lst[:]

import copy
lst3 = copy.copy(lst)
4b9b3361

Ответ 1

Если вы хотите, чтобы мелкая копия (элементы не копируются), используйте:

lst2=lst1[:]

Если вы хотите сделать глубокую копию, используйте модуль копирования:

import copy
lst2=copy.deepcopy(lst1)

Ответ 2

Я часто использую:

lst2 = lst1 * 1

Если lst1 содержит другие контейнеры (например, другие списки), вы должны использовать deepcopy из копии lib, как показано Mark.


ОБНОВЛЕНИЕ: Объяснение глубины

>>> a = range(5)
>>> b = a*1
>>> a,b
([0, 1, 2, 3, 4], [0, 1, 2, 3, 4])
>>> a[2] = 55 
>>> a,b
([0, 1, 55, 3, 4], [0, 1, 2, 3, 4])

Как вы видите только измененный... Я попробую теперь со списком списков

>>> 
>>> a = [range(i,i+3) for i in range(3)]
>>> a
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> b = a*1
>>> a,b
([[0, 1, 2], [1, 2, 3], [2, 3, 4]], [[0, 1, 2], [1, 2, 3], [2, 3, 4]])

Не так читаем, позвольте мне напечатать его с помощью: for:

>>> for i in (a,b): print i   
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3], [2, 3, 4]]
>>> a[1].append('appended')
>>> for i in (a,b): print i

[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]
Вы видите это? Он также добавлен к b [1], поэтому b [1] и [1] являются тем же самым объектом. Теперь попробуйте с помощью deepcopy
>>> from copy import deepcopy
>>> b = deepcopy(a)
>>> a[0].append('again...')
>>> for i in (a,b): print i

[[0, 1, 2, 'again...'], [1, 2, 3, 'appended'], [2, 3, 4]]
[[0, 1, 2], [1, 2, 3, 'appended'], [2, 3, 4]]

Ответ 3

Вы также можете сделать:

a = [1, 2, 3]
b = list(a)

Ответ 4

Мне нравится:

lst2 = list(lst1)

Преимущество над lst1 [:] заключается в том, что для dicts действует одна и та же функция:

dct2 = dict(dct1)

Ответ 5

Короткие списки, [:] являются лучшими:

In [1]: l = range(10)

In [2]: %timeit list(l)
1000000 loops, best of 3: 477 ns per loop

In [3]: %timeit l[:]
1000000 loops, best of 3: 236 ns per loop

In [6]: %timeit copy(l)
1000000 loops, best of 3: 1.43 us per loop

Для более крупных списков все они одинаковы:

In [7]: l = range(50000)

In [8]: %timeit list(l)
1000 loops, best of 3: 261 us per loop

In [9]: %timeit l[:]
1000 loops, best of 3: 261 us per loop

In [10]: %timeit copy(l)
1000 loops, best of 3: 248 us per loop

Для очень больших списков (я попробовал 50MM), они все равно примерно то же самое.

Ответ 6

Вы также можете сделать это:

import copy
list2 = copy.copy(list1)

Это должно сделать то же самое, что и Марк Родди, мелкой копии.

Ответ 7

С точки зрения производительности, есть накладные расходы на вызов list() по сравнению с нарезкой. Поэтому для коротких списков lst2 = lst1[:] примерно в два раза быстрее, чем lst2 = list(lst1).

В большинстве случаев это, вероятно, перевешивает тот факт, что list() более читабельна, но в узких циклах это может быть ценной оптимизацией.