Python学习之路:关于列表(List)复制的那点事

要谈列表的复制,我们就要谈到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已经没有那种剪不断理还乱的羁绊了 (乛◡乛) 

 

posted @ 2019-08-25 20:53  这解药有毒  阅读(320)  评论(0编辑  收藏  举报