Python中浅拷贝是否应创建id不同的对象?列表赋值结果疑问
问题核心原因:list2 = list1 不属于浅拷贝操作,只是变量引用赋值
你当前的代码并没有执行浅拷贝逻辑:
- Python 中直接用
=对可变对象赋值时,本质是给同一个内存对象绑定额外的变量别名,没有生成新的对象实例。因此list1和list2完全指向同一个列表对象,二者id自然相等。 - 你认知里「创建新的容器对象、元素引用和原对象保持一致」的逻辑才是浅拷贝的行为,要触发浅拷贝需要主动调用对应方法,常见的列表浅拷贝写法有三种:
执行以上任意一种写法后再做校验,就会得到你预期的结果:# 写法1:调用copy方法 list2 = list1.copy() # 写法2:用list构造器 list2 = list(list1) # 写法3:切片操作 list2 = list1[:]id(list1) == id(list2) # False,容器是新对象 id(list1[0]) == id(list2[0]) # True,元素引用还是指向原对象
补充:浅拷贝与深拷贝的差异
如果列表中包含嵌套的可变对象(比如子列表、字典),浅拷贝只会拷贝最外层容器,内部嵌套的可变对象依然共用引用;如果需要完全独立的拷贝,需要调用copy模块的deepcopy方法实现深拷贝:
import copy list_a = [[1,2], 3, 4] # 浅拷贝 list_b = copy.copy(list_a) list_b[0][0] = 99 print(list_a[0][0]) # 输出99,原列表的嵌套元素被修改 # 深拷贝 list_c = copy.deepcopy(list_a) list_c[0][0] = 100 print(list_a[0][0]) # 仍输出99,原列表完全不受影响
内容的提问来源于stack exchange,提问作者Tanvi Baweja
相关产品推荐
相关产品推荐

