要谈列表的复制,我们就要谈到Python的赋值规则
首先我们创建列表a:
a = [1,2,3]
通常我们复制一个元素的方法是这样的:
b = a #复制元素的一般方法 print(a) print(b) 结果为: [1,2,3] [1,2,3]
通过这行代码,我们固然是创建了一个与列表a相等的列表b,但此时却会出现一个问题:
当我们尝试对新创建的列表b进行排序操作(如倒序操作)时:
b.reverse() print(b) 结果为: [3,2,1]
到这里一切看似没啥毛病,实则坑爹的事情已经悄然发生~
让我们尝试打印一下列表a的值:
print(a) 结果为: [3,2,1]
可以看到,列表a的排序也改变了
这未必是我们希望看到的结果
出现这种情况的原因是:
当我们使用“b=a”这条代码来赋值列表b时,列表b与列表a是指向同一个地址的,而对列表进行排序操作并不会赋给列表一个新的地址,也就是说此时无论我们是对列表a或是对列表b进行排序操作,另一个列表的排序也会随之改变
而如果我们对列表a或是对列表b进行赋值操作的话,则没有这种顾虑,因为在赋值的时候列表会分配到一个新的地址
那么我们要如何解决这一问题呢?
很简单,只需利用列表的分片,使用如下代码对列表进行复制操作:
a = [1,2,3] b = a[:] #复制列表的正确方式 print(a) print(b) 结果为: [1,2,3] [1,2,3]
此时我们再对列表b进行倒序操作:
b.reverse() print(a) print(b) 结果为: [1,2,3] [3,2,1]
可以看到只有列表b的排序改变了,而列表a的排序没有变,那是因为列表a和列表b已经没有那种剪不断理还乱的羁绊了 (乛◡乛)