a=[1,2,3,4,5]
b=a[:]
c=list(b)
a2=a
a2[0]=5
我们来看这几个语句,第一,二,三行分别定义了一个列表,对列表进行切片操作并创造一个新列表赋值给b,对b列表(或任何可迭代数据)转换为列表类型,并返回转换后的列表赋值给c,这样理解下来那列表a,b,c分别指向内存中不同的地址。
第四行中我们把a列表赋值给了变量a2,那么a2的地址是否和a的地址一样呢?答案是肯定的,我们对a2的第一个元素进行赋值操作来改变元素的值,我们发现a列表中元素也发生了同样的改变,证明了上述结论,这里有个很好的网站->pythontutor,可以实现可视化代码的执行过程(不只是python)。
![](https://i-blog.csdnimg.cn/blog_migrate/c5da49f8d625ff1d1c4248fd657033e0.png)
以上这些操作(除了第五行)都是非破坏性的,也就是说每个操作都不是改变输入的操作,例如第二行语句并没有改变列表a,那如果把语句 a2[0]=5 替换成语句 a2[0]=['a','b'] 呢,我们发现列表a2的第一个元素指向的是列表['a','b'] 的地址。
![](https://i-blog.csdnimg.cn/blog_migrate/16e08fa786c3ae89afc18e195e12c6c2.png)
再来看个有趣的问题,我们看以下语句
a=[1,2,3,4,5]
b=a
a=a+[6,7]
我们把列表赋值给a,然后把a赋值给b,现在a和b就指向同一个地址了,然后我们执行a=a+[6,7],我们发现,该操作会返回一个新列表,也就是说a指向的地址被改变了
![](https://i-blog.csdnimg.cn/blog_migrate/1a0c78a2f68146bb4f1e2d576df00b64.png)
那如果指向语句a+=[6,7] 呢,我们发现他并没有返回一个新列表,而是在旧列表上进行改变,这很神奇!
![](https://i-blog.csdnimg.cn/blog_migrate/e0ec85d76cc0d886ad2a4dd7751641d2.png)
我们再来看看append和extend方法
执行语句
a=[1,2]
b=[3,4]
a.append(b)
b[0]='woshishabi'
![](https://i-blog.csdnimg.cn/blog_migrate/f094c030771043ff3486b6555bbd1874.png)
我们发现把b嵌套进a后,对b的改变,也会影响到a,然而extend就不会,执行以下语句,我们就可以看出区别。
a=[1,2]
b=[3,4]
a.extend(b)
b[0]='woshishabi'
![](https://i-blog.csdnimg.cn/blog_migrate/9e387422cb137db73288511069aa68bb.png)
记录这些只是感觉比较有趣,我们平时使用的时候一般只需要知道执行的结果就可以了。