2010-11-02 145 views

回答

61

读取时,list是原始列表的引用,list[:]浅副本列表。

分配时,list(重新)绑定名称和list[:]切片分配,替换列表中以前的内容。

此外,不要使用list作为名称,因为它会遮挡内置。

18

后者是对列表副本的引用而不是对列表的引用。所以这非常有用。

>>> li = [1,2,3] 
>>> li2 = li 
>>> li3 = li[:] 
>>> li2[0] = 0 
>>> li 
[0, 2, 3] 
>>> li3 
[1, 2, 3] 
2

将第一个list应用于变量将创建对原始列表的引用。 第二个list[i]将创建一个浅拷贝。

例如:

foo = [1,2,3] 
bar = foo 
foo[0] = 4 

酒吧和Foo现在将是:

[4,2,3] 

但:

foo = [1,2,3] 
bar = foo[:] 
foo[0] = 4 

结果将是:

bar == [1,2,3] 
foo == [4,2,3] 

:是切片。

3

但是,如果列表元素本身是列​​表,即使list1 = list[:]也有它的问题。试想一下:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> b = a[:] 
>>> b[0].remove(2) 
>>> b 
[[1, 3], [4, 5, 6], [7, 8, 9]] 
>>> a 
[[1, 3], [4, 5, 6], [7, 8, 9]] 

这是因为被复制到B每个列表元素是一个列表本身,而这种复制列表涉及与正常list1 = list2出现相同的问题。 我发现最短的出路是每一个列表元素这样明确地复制:

>>> a = [[1,2,3],[4,5,6],[7,8,9]] 
>>> b=[[j for j in i] for i in a] 
>>> b 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 
>>> b[0].remove(2) 
>>> b 
[[1, 3], [4, 5, 6], [7, 8, 9]] 
>>> a 
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

当然,在嵌套表嵌套每增加一个等级,复制代码深化了额外的内联for循环。

+1

如果你在外部列表中有不同的或未知的嵌套层次,这将会遇到严重的问题('''可能不可迭代)如果你有嵌套列表,你应该使用[copy](http:// docs.python。org/library/copy.html)模块,使用'b = copy.deepcopy(a)'而不是嵌套for循环。 – RoundTower 2011-07-12 11:53:58

+0

^感谢您的提示! – 2011-07-12 15:18:57

1

li [:]创建原始列表的副本。但它并不涉及同一个列表对象。因此,您不必冒险更改由li [:]创建的副本来更改原始列表。

例如:

>>> list1 = [1,2,3] 
>>> list2 = list1 
>>> list3 = list1[:] 
>>> list1[0] = 4 
>>> list2 
[4, 2, 3] 
>>> list3 
[1, 2, 3] 

这里list2通过改变list1改变,但list3不会改变。

相关问题