首先我们需要明确列表的深浅复制是针对被嵌套的列表而言的,也就是说只有对嵌套列表我们才需要考虑这个问题。来看例子。
list1=[‘老大‘,‘老二‘,[‘老三‘,‘老四‘,‘老五‘],‘老六‘,‘老七‘] list2=list1.copy() print(list1,‘\n‘,list2) #打印两个列表 print(id(list1),‘\n‘,id(list2)) #打印两个列表的地址 print(id(list1[2]),‘\n‘,id(list2[2])) #打印两个嵌套列表的地址
运行结果
[‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘] 3072878348 3072561644 3072841164 3072841164
从结果中可以看出,虽然list1与liat2的地址相同,但是嵌套的列表[‘老三‘, ‘老四‘, ‘老五‘]却有着相同的地址。这就是一种浅复制。如果此时我们修改嵌套列表的值。两个列表就都会发生改变。看下面的代码。
list1[2][1]=‘哈哈哈‘ print(list1,‘\n‘,list2)
运行结果
[‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘]
其实原理非常简单,中间被嵌套的列表实际上是单独被分配的空间,然后list1和list2都是去引用的地址,所以当它的值改变,两个列表就都跟着变了。
深复制
深复制需要用到copy模块,来看例子。
import copy list1=[‘老大‘,‘老二‘,[‘老三‘,‘老四‘,‘老五‘],‘老六‘,‘老七‘] list2=copy.deepcopy(list1) print(list1,‘\n‘,list2) #打印两个列表 print(id(list1),‘\n‘,id(list2)) #打印两个列表的地址 print(id(list1[2]),‘\n‘,id(list2[2])) #打印两个嵌套列表的地址
结果
[‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘] 3071562732 3071928940 3071600076 3071600108
这是我们如果修改嵌套的列表的值,两个列表会发生什么变化呢?
list1[2][1]=‘哈哈哈‘ print(list1,‘\n‘,list2)
结果
[‘老大‘, ‘老二‘, [‘老三‘, ‘哈哈哈‘, ‘老五‘], ‘老六‘, ‘老七‘] [‘老大‘, ‘老二‘, [‘老三‘, ‘老四‘, ‘老五‘], ‘老六‘, ‘老七‘]
原文地址:https://www.cnblogs.com/austinjoe/p/9379289.html
时间: 2024-10-09 10:04:47