|
我在之前的一个小程序当中,没能关注到列表复制这个问题,于是我们造成了一哥错误,这里我把它提出来
我们在对list 进行复制操作的时候一般有三种方法:
首先我们先初始化一个列表
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode list1 = [1,2,3,4,5]
然后我们分别进行3种拷贝的操作
>>> list2 = list1
>>> list2
[1, 2, 3, 4, 5]
>>> list3 = list1[:]
>>> list3
[1, 2, 3, 4, 5]
>>> list4 = list1.copy()
>>> list4
[1, 2, 3, 4, 5]
我们现在来对源列表也就是list1 进行一个操作
>>> list1.reverse()
>>> list1
[5, 4, 3, 2, 1]
那我们现在来看看list2 ,list3 , list4 的变化
>>> list2
[5, 4, 3, 2, 1]
>>> list3
[1, 2, 3, 4, 5]
>>> list4
[1, 2, 3, 4, 5]
我们发现,list2随着 list1的变化而变化,于是引发了一个讨论
对于python而言
列表名实际上对应了一个标签。
我们将一个列表名直接复制给另一个列表名实际上我们对应的还是同一块地址。
这个有点像C语言的指针的概念。
由于对应的是同一块地址,那么当list1 改变吗实际上list2也已经改变了,因为他们本来指向的就是同一块地址,换了个名字而已
而对于我们后两种的复制,那么实际上是另外开辟了一块地址,原原本本的将我们列表的值复制了过去。操作list1并不会影响list3 和list4
这是一个小的问题,但是如果没有注意当程序出现问题后,很难排查到。
|
|