2008-10-08 5 views

ответ

86

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

lst2=lst1[:] 

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

import copy 
lst2=copy.deepcopy(lst1) 
+1

Что вы подразумеваете под элементами не копируются? – sheats 2008-10-08 20:16:54

+4

Если элементы являются изменяемыми объектами, они передаются по ссылке, вы должны использовать deepcopy, чтобы их действительно скопировать. – 2008-10-08 20:20:17

+2

Он копирует только ссылки, которые хранятся в списке. Если элемент в списке содержит ссылку на другой объект, который не будет скопирован. 9 раз из 10 вам просто нужна мелкая копия. – 2008-10-08 20:22:10

18

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

lst2 = lst1 * 1 

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


UPDATE: Объясняя DeepCopy

>>> 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]]) 

Не так читаемым, позвольте мне напечатать его с a для:

>>> 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]] 
2

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

import copy 
list2 = copy.copy(list1) 

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

12

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

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

Я хотел бы сделать:

lst2 = list(lst1) 

Преимущество перед lst1 [:] является то, что та же идиома работает dicts:

dct2 = dict(dct1) 
0

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

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

3

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

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 

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

Смежные вопросы