Python列表赋值后原变量随新变量改变的原因及解决方法
问题分析与解决
先看你给出的代码:
a = [1,2,4] b=a b.insert(1,45) print(a,b)
运行结果里a和b同时被修改,具体原因和解决方法如下:
为什么修改b会影响a?
在Python中,列表属于可变引用类型。当你执行b = a时,并没有复制a指向的列表内容,而是让变量b和a指向了内存中同一个列表对象。这就像两个人拿着同一把钥匙开同一扇门,不管谁进去修改屋里的东西,另一个人看到的结果都是修改后的样子。所以用b.insert()操作的是这个共享的列表,a自然也会跟着变化。
如何让修改b不影响a?
你需要创建原列表的独立副本,让b指向这个新的列表对象,常用方法有这几种:
1. 切片复制
利用列表切片[:]生成新列表,这是最常用的浅拷贝方式:
a = [1,2,4] b = a[:] # 生成原列表的副本 b.insert(1,45) print(a,b) # 输出: [1, 2, 4] [1, 45, 2, 4]
2. 使用list()构造函数
把原列表传入list(),会返回一个新的列表对象:
a = [1,2,4] b = list(a) b.insert(1,45) print(a,b)
3. 使用copy模块的浅拷贝
如果需要更明确的拷贝操作,可以用copy模块的copy()方法:
import copy a = [1,2,4] b = copy.copy(a) b.insert(1,45) print(a,b)
4. 深拷贝(针对嵌套列表)
如果你的列表里包含其他可变对象(比如嵌套列表),浅拷贝只会复制外层对象,内部对象还是共享的,这时候需要用deepcopy():
import copy a = [1, [2, 4]] b = copy.deepcopy(a) b[1].append(6) print(a,b) # 输出: [1, [2, 4]] [1, [2, 4, 6]]
内容的提问来源于stack exchange,提问作者Starpower Power
相关产品推荐
相关产品推荐

