python的列表复制详解
Posted rivendare
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的列表复制详解相关的知识,希望对你有一定的参考价值。
非复制但内容一致的情况
首先生成列表list1,list2,查看其中内容,对内容做比较,对内存id做比较:
list1 = list(range(5)) list2 = list(range(5)) print(list1) print(list2) print(list1 == list2) print("list1 ID:",id(list1)) print("list2 ID:",id(list2))
输出结果为:
[0, 1, 2, 3, 4] [0, 1, 2, 3, 4] True list1 ID: 2402197214728 list2 ID: 2402197214856
依输出结果可见,两个列表只是都迭代了range(5),内容一致,但内存地址不同,相互独立。
列表赋值复制
生成列表list1,将list3赋值等于list1,对内容做比较,对内存id做比较:
list1 = list(range(5)) list3 = list1 list3[1] = 8 print(list3) print(list1) print("list1 ID:",id(list3)) print("list2 ID:",id(list1))
输出结果为:
[0, 8, 2, 3, 4] [0, 8, 2, 3, 4] list1 ID: 2439749211784 list2 ID: 2439749211784
依输出结果可见,当list3赋值等于list1时,当对任意一列表进行修改时,另外一个列表同时被修改,原因是两个列表所调用的内存地址相同,两个入口同时指向同一内存地址,与linux文件系统的硬链接相似。
for循环迭代追加复制
生成空列表list4,将list2中的内容使用for循环迭代追加至list4,对内容做比较,对内存id做比较:
list2 = list(range(5)) list4 = [] for _ in list2: list4.append(_) print(list2) print(list4) print(list2 == list4) print("list2 ID:",id(list2)) print("list4 ID:",id(list4))
输出结果为:
[0, 1, 2, 3, 4] [0, 1, 2, 3, 4] True list2 ID: 1698948945544 list4 ID: 1698948944392
依输出结果可见,for循环迭代复制后的list4和list2内容一致,但内存地址不同,list只是复制了list2中的内容,但两者相互独立。
列表的浅copy复制(shadow copy)
将列表list6对list5进行浅copy,对内容做比较,对内存id做比较:
list5 = [1,2,"qwer",[5,6]] list6 = list5.copy() print(list5) print(list6) print(list5 == list6) print("list5 ID:",id(list5)) print("list6 ID:",id(list6)) list5[3][0] = ‘asdf‘ print(list5) print(list6) print(id(list5[-1])) print(id(list6[-1]))
输出结果为:
[1, 2, ‘qwer‘, [5, 6]] [1, 2, ‘qwer‘, [5, 6]] True list5 ID: 3016971798152 list6 ID: 3016972669320 [1, 2, ‘qwer‘, [‘asdf‘, 6]] [1, 2, ‘qwer‘, [‘asdf‘, 6]] 3016972669448 3016972669448
依输出结果可见,list6对list5 进行浅copy后,两个列表内容一致,内存地址不相同。但当对list5中的引用类型进行修改后,list6中的同时也被修改了,原因是进行浅copy操作后,list6和list5的引用类型内存地址一样,所以对list5修改时,list6也被修改。
列表的深copy复制
将列表list7对list8进行深copy,需要import copy模块。对内容做比较,对内存id做比较:
import copy list7 = [1,2,"qwer",[5,6]] list8 = copy.deepcopy(list7) print(list7) print(list8) print(list7 == list8) print("list7 ID:",id(list7)) print("list8 ID:",id(list8)) list7[3][0] = ‘asdf‘ print(list7) print(list8) print(id(list7[-1])) print(id(list8[-1]))
输出结果为:
[1, 2, ‘qwer‘, [5, 6]] [1, 2, ‘qwer‘, [5, 6]] True list7 ID: 1797818246088 list8 ID: 1797818247368 [1, 2, ‘qwer‘, [‘asdf‘, 6]] [1, 2, ‘qwer‘, [5, 6]] 1797818245896 1797818247304
依输出结果可见,list8对list7进行深copy后,两个列表内容一致,内存地址不相同。当对list7中的引用类型进行修改后,list8并没有被修改,list7和list8的引用类型内存地址不一样。list7和list8内容一致,但完全独立。
如果想让copy对象与原列表真正的完全不同,就需要用到深copy
以上是关于python的列表复制详解的主要内容,如果未能解决你的问题,请参考以下文章