Python列表修改后变更同步至副本的问题排查
为什么修改原列表的子元素会同步到拷贝列表?
嘿,这问题我太熟了——你踩中了Python浅拷贝的坑!
你用的desc.copy()、切片desc[:]或者list(desc)都是浅拷贝操作。这种拷贝方式只会复制外层列表的结构,但对于列表里的嵌套子列表(比如["1"]、['1','2']这些),它不会创建新的子列表对象,只是把原列表里子列表的引用复制了一份到新列表里。换句话说,desc和desc1里的对应子列表其实是同一个对象,你改其中一个,另一个当然会跟着变!
要解决这个问题,你需要用深拷贝——也就是递归地复制所有嵌套的元素,让新列表和原列表彻底断绝引用关系。Python的copy模块里的deepcopy()方法就是干这个的。
给你改好的代码:
import copy name = ['A', 'B', 'C', 'D', 'E'] desc = [["1"], ['1', '2'], [], ['1', '2'], []] desc1 = copy.deepcopy(desc) # 换成深拷贝 for n, d in zip(name, desc): d.insert(0, n) print(desc1)
运行这段代码,输出就会是你期望的:
[['1'], ['1', '2'], [], ['1', '2'], []]
简单总结下:如果列表里都是字符串、数字这种不可变元素,浅拷贝就够用;但只要有列表、字典这种可变的嵌套元素,就得用深拷贝来保证两个列表完全独立。
内容的提问来源于stack exchange,提问作者Vedant Modi
相关产品推荐
相关产品推荐

