You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中列表赋值后修改其中一个为何另一个也改变?如何保留原列表初始值?

Python中列表赋值后修改其中一个为何另一个也改变?如何保留原列表初始值?

嗨,这个问题我刚学Python的时候也踩过一模一样的坑!其实核心原因是Python里的列表属于可变对象,直接赋值传递的是对象的引用,不是内容的拷贝

当你写req2 = req1的时候,并没有把req1里的[23,24,25]复制一份给req2,而是让req2req1指向了内存中同一个列表对象。就好比你和朋友共用同一个笔记本,你在本子上添了一行字,朋友翻开看到的自然也是添过字的版本——所以你给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

火山引擎 最新活动