在Python中列表和列表有什么区别?
什么,如果有的话,在Python中的list
和list[:]
之间的区别?
阅读时, 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
不改变。