Python中修改单个列表却导致两个列表同时变更的问题求解
问题原因分析
核心问题是 Python 中可变对象的引用传递规则:列表属于可变对象,直接赋值时只会传递内存引用,不会自动生成新的独立副本。
我们逐段拆解代码运行逻辑:
- 初始化阶段
sub = [[1,2,3],[1,2,3]]
此时sub[0]和sub[1]是两个完全独立的列表对象,指向不同的内存地址,所以第一次调用switcher(sub[0])时,仅修改了sub[0]指向的列表内容,sub[1]不受影响,输出结果符合预期。 - 还原操作阶段
sub[0] = sub[1]
这一步没有生成新的列表,只是让sub[0]也指向了sub[1]对应的内存地址。此时sub[0]和sub[1]本质是同一个列表的两个别名,修改任意一个都会同步影响另一个的取值。 - 第二次调用
switcher(sub[0])
此时修改的是两个索引共同指向的同一个列表,所以输出时两个位置的取值都会发生变化。
解决方法
如果要让还原后的 sub[0] 是独立对象,赋值时需要显式生成列表副本,可选写法如下:
# 方法1:切片拷贝 sub[0] = sub[1][:] # 方法2:list构造函数 sub[0] = list(sub[1]) # 方法3:copy模块 import copy sub[0] = copy.copy(sub[1])
上述任意一种写法执行后,sub[0] 和 sub[1] 会回到独立对象的状态,后续修改 sub[0] 不会再影响 sub[1]。
内容的提问来源于stack exchange,提问作者sesrkuse
相关产品推荐
相关产品推荐

