Python中修改原列表时切片复制得到的列表也发生改动的原因是什么?
原因解析
你观察到的现象是Python 浅拷贝 的固有特性,具体逻辑如下:
a[:]切片语法属于浅拷贝操作,只会创建一个新的外层列表对象,不会递归拷贝内部嵌套的可变子对象。- 执行
b = a[:]时,新列表 b 的每个元素与原列表 a 的对应元素指向完全相同的内存对象:- 列表第一个元素是整数(不可变类型),直接拷贝值,两个列表的第一个元素完全独立,修改不会互相影响。
- 列表第二个元素是嵌套列表(可变类型),浅拷贝只会复制它的内存地址引用,也就是说
a[1]和b[1]指向内存中同一个嵌套列表对象。
- 当你执行
a[1][1] = 5时,实际修改的是两个列表共同指向的那个嵌套列表的内部值,所以通过 b 访问对应位置时,自然会返回修改后的结果。
如果需要拷贝后两个列表完全独立,修改嵌套元素互不影响,可以使用深拷贝:
import copy a = [1, [2, 3]] b = copy.deepcopy(a) a[1][1] = 5 print(b) # 输出 [1, [2, 3]]
内容的提问来源于stack exchange,提问作者AungMinKhant
相关产品推荐
相关产品推荐

