在Python中列表和列表有什么区别?

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

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

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

此外,不要使用list作为名称,因为它影响内置。

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

 >>> li = [1,2,3] >>> li2 = li >>> li3 = li[:] >>> li2[0] = 0 >>> li [0, 2, 3] >>> li3 [1, 2, 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循环加深。

将第一个list到variables将创build对原始列表的引用。 第二个list[i]将创build一个浅拷贝。

例如:

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

酒吧和美孚现在将是:

 [4,2,3] 

但:

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

结果将是:

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

:是切片。

li [:]创build原始列表的副本。 但它不涉及同一个列表对象。 因此,您不必担心通过更改li [:]创build的副本来更改原始列表。

例如:

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

这里list2是通过改变list1而改变的,但是list3不改变。