Python中如何避免列表可变性?修改列表b时如何保持列表a不变?
问题:修改列表b时如何保持列表a不被同步改动?
在Python中执行以下代码时,修改列表b会导致列表a同步更改,请问有没有办法修改b的同时让a保持不变?
a = [1,2,3] b = a print(a) print(b) b[0]=100 print(a) print(b)
输出结果:
[1, 2, 3] [1, 2, 3] [100, 2, 3] [100, 2, 3]
解决方案
当然有办法啦!问题的根源在于b = a只是让b和a指向了同一个列表对象,并不是创建了一个新的列表副本。下面几种方法都能帮你创建真正独立的列表:
方法1:使用切片操作创建副本
切片[:]会返回原列表的一个浅拷贝,这样b就成了新的列表对象,和a完全独立。示例代码:a = [1,2,3] b = a[:] # 用切片创建副本 b[0] = 100 print(a) # 输出 [1, 2, 3] print(b) # 输出 [100, 2, 3]方法2:使用
list()构造函数
把原列表传入list()函数,也会生成一个新的列表副本:a = [1,2,3] b = list(a) b[0] = 100 print(a) # 输出 [1, 2, 3] print(b) # 输出 [100, 2, 3]方法3:使用
copy模块的拷贝方法
Python的copy模块提供了专门的拷贝工具,浅拷贝用copy.copy();如果你的列表里包含嵌套的可变对象(比如子列表、字典),还可以用copy.deepcopy()来创建完全独立的深拷贝:import copy a = [1,2,3] b = copy.copy(a) # 浅拷贝 # 若列表含嵌套元素,比如a = [1, [2,3]],则用copy.deepcopy(a) b[0] = 100 print(a) # 输出 [1, 2, 3] print(b) # 输出 [100, 2, 3]
需要注意:如果列表里有嵌套的可变元素,浅拷贝只能复制外层列表,子元素还是会和原列表共享,这时候就必须用深拷贝来实现完全隔离。
内容的提问来源于stack exchange,提问作者navarone
相关产品推荐
相关产品推荐

