2010-10-22 64 views
2

簡單的Python問題:Python列表幫助

實施例列表:A = [1,2,3,4,5]

我需要生成另一個列表乙 其爲列表的淺表副本甲 使得B是含有相同的元素的新列表以相同的順序排列(這樣我就可以用B的元素中沒有一個影響A的元素)。我怎樣才能做到這一點?


澄清:我要像做

def some_func(A) 
    B = {what do I do here to get a copy of A's elements?} 
    B[0] = some_other_func(B[0]) 
    yet_another_func(B) 

根據你的答案+ Python文檔,一個更好的方式做我想做的是:

def some_func(A) 
    B = [some_other_func(A[0])] + A[1:] 
    yet_another_func(B) 

感謝您指點我正確的方向!

+4

那個淺拷貝是怎麼回事? – codaddict 2010-10-22 19:42:04

+0

你需要像JoshD提到的那樣進行深層複製。真的把我們扔到那裏! – birryree 2010-10-22 19:43:08

+0

剛剛添加了一個說明。我很確定我想淺一點,而不是一個很深的副本。 – 2010-10-22 19:43:14

回答

5

這裏有3種方式,使列表A的副本:

使用切片表示法:

copy_of_A = A[:] 

使用列表構造:

copy_of_A = list(A) 
當你要求這些副本都是淺拷貝

from copy import copy 
copy_of_A = copy(A) 

使用複製模塊。要了解淺拷貝和深拷貝的區別,請閱讀documentation of the copy module

+1

+1引用複製文檔的術語。 – 2010-10-22 19:52:29

+0

@Jason S,我想我應該更加明確我的鏈接:)還有+1。很好的答案。 – JoshD 2010-10-22 20:03:36

8

這將是一個深層複製,而不是一個淺層。

列出默認情況下的複製淺度。這就是爲什麼copy module中有deepcopy命令。

B = copy.deepcopy(A)

可選,B = A[:]會做。但爲了未來,請記住深刻的理解。更復雜的數據類型可以從中受益。


新增信息有關副本:

淺表副本:

b = [1,2] 
a = b 
b[0] = 11 
print a // [1,11] 

深副本:

b = [1,2] 
a = b[:] 
b[0] = 11 
print a // [1,2] 

但是,還有:

>>> a = [[1,2]] 
>>> b = a[:] 
>>> b 
[[1, 2]] 
>>> a 
[[1, 2]] 
>>> a[0][0] = 11 
>>> a 
[[11, 2]] 
>>> b 
[[11, 2]] 
>>> 

因此,在這種情況下,元素本身就是淺拷貝。

+0

+1分裂重要的頭髮:-) – 2010-10-22 20:10:56

+0

@Jason S,謝謝。我用這個問題學到了一些東西。所以,也+1! – JoshD 2010-10-22 20:12:46

3

B=A[:]足夠:

In [22]: A=[1,2] 

In [23]: B=A[:] 

In [24]: B[0]=100 

In [25]: A 
Out[25]: [1, 2] 

In [26]: B 
Out[26]: [100, 2] 

A[:]採用分片符號與A所有元素,以獲得片。 由於Python列表片段總是返回新列表,因此您將獲得A的副本。

請注意,B中的元素與A中的元素相同。 如果元素是可變的,通過B對它們進行變異會影響A.

+1

我想我們都需要澄清一下,我們是指列表的淺表副本和列表中元素的淺表副本。當我聽到列表的淺拷貝時,我想'a = b'。你做了什麼,我會調用一個深層副本,即使這些元素本身是淺拷貝,_list_也是一個深層副本。 – JoshD 2010-10-22 19:49:26

+0

@JoshD:我認爲你是對的,我濫用術語「淺拷貝」定義在這裏:http://en.wikipedia.org/wiki/Shallow_copy#Shallow_copy – unutbu 2010-10-22 19:54:27

+0

這是一個尷尬的情況,因爲兩者都在發生。 A是B的深層拷貝,但A [0]是B [0]的淺拷貝。你現在的答案非常好,並且完美地解決了這個問題。 +1 – JoshD 2010-10-22 20:01:00

3

像這樣:

B = A[:] 
2
import copy 
A=[1,2,3,4,5] 
B=copy.copy(A) 
B[0]=9999 
print B[0] 
print A[0] 

import copy和使用copy.copy()進行復印。 見this供參考。

3

您可以通過以下方式執行副本:

B = A[:]