6 题: list和list [:]在python中有什么区别?

在...创建的问题 Tue, Nov 2, 2010 12:00 AM

如果有的话,python中listlist[:]之间有什么区别?

    
46
6答案                              6 跨度>                         

阅读时,list是对原始列表的引用,list[:]是浅层复制列表。

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

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

    
71
2010-11-02 19:55:11Z

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

 
>>> li = [1,2,3]
>>> li2 = li
>>> li3 = li[:]
>>> li2[0] = 0
>>> li
[0, 2, 3]
>>> li3
[1, 2, 3]
    
22
2010-11-02 19:54:56Z

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

例如:

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

bar和foo现在将是:

 
[4,2,3]

但:

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

结果将是:

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

:是切片。

    
3
2010-11-02 20:03:28Z

但是,如果列表元素本身就是列表,那么即使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循环加深。

    
3
2011-04-30 21:09:55Z
  1. 如果你的外部列表中有不同或未知的嵌套级别(i可能无法迭代),这将遇到严重问题如果你有嵌套列表,你应该是使用复制模块,使用b = copy.deepcopy(a)而不是嵌套for循环。
    2011-07-12 11:53:58Z
  2. ^感谢您提示!
    2011-07-12 15:18:57Z
  3. 醇>

li [:]创建原始列表的副本。但它没有引用相同的列表对象。因此,您无需通过更改li [:]创建的副本来更改原始列表。

例如:

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

此处list2通过更改list1而更改,但list3未更改。

    
3
2012-07-09 06:00:38Z

第一个引用原始列表。第二个指向原始列表的副本。
看看这个!

 
>>> a = [1, 2, 3]
>>> b = a
>>> c = a[:]
>>> a == b
True
>>> a is b
True
>>> a == c
True
>>> a is c
False
>>> a.__repr__
<method-wrapper '__repr__' of list object at 0x7f87a9ba3688>
>>> a.__repr__()
'[1, 2, 3]'
>>> b.__repr__
<method-wrapper '__repr__' of list object at 0x7f87a9ba3688>
>>> c.__repr__
<method-wrapper '__repr__' of list object at 0x7f87ad352988>

请注意, a b 都指向地址 0x7f87a9ba3688 ,而c 指向 0x7f87ad352988
差异很明显。
a b 对原始列表对象的引用。
然而, c 指向(原始列表的)副本,因此它位于不同的位置。

    
1
2018-07-03 14:14:48Z
来源放置 这里