Python中列表赋值后修改其中一个为何另一个也改变?如何保留原列表初始值?
Python中列表赋值后修改其中一个为何另一个也改变?如何保留原列表初始值?
嗨,这个问题我刚学Python的时候也踩过一模一样的坑!其实核心原因是Python里的列表属于可变对象,直接赋值传递的是对象的引用,不是内容的拷贝。
当你写req2 = req1的时候,并没有把req1里的[23,24,25]复制一份给req2,而是让req2和req1指向了内存中同一个列表对象。就好比你和朋友共用同一个笔记本,你在本子上添了一行字,朋友翻开看到的自然也是添过字的版本——所以你给req2append26,本质是修改了那个共同的列表,req1作为同一个列表的“别名”,显示的结果当然也跟着变了。
想要保留req1的原始值,你需要给req2创建一个原列表的独立副本,有几种简单好用的方法:
- 用切片操作创建浅拷贝:
req2 = req1[:],切片[:]会取原列表的所有元素,生成一个全新的列表对象 - 调用列表的
copy()方法:req2 = req1.copy(),这是Python列表专门提供的浅拷贝方法,语义更直白 - 用
list()构造函数:req2 = list(req1),把原列表传入list(),也会生成一个完全独立的新列表
修改后的代码示例:
req1 = [23,24,25] # 选下面任意一种方式创建副本即可 req2 = req1.copy() # 方式1 # req2 = req1[:] # 方式2 # req2 = list(req1) # 方式3 req2.append(26) op = [[],[]] op[0] = req2 op[1] = req1 print(op) # 此时输出:[[23, 24, 25, 26], [23, 24, 25]]
额外补一句:如果你的列表里嵌套了其他可变对象(比如列表里套列表、字典),上面的浅拷贝可能就不够用了,这时候需要用深拷贝——先导入copy模块,然后req2 = copy.deepcopy(req1),它会递归复制所有嵌套的可变对象,确保两个列表完全独立。不过你的例子是一维列表,浅拷贝就完全能解决问题啦!
备注:内容来源于stack exchange,提问作者Tim




