You need to enable JavaScript to run this app. Python中浅拷贝是否应创建id不同的对象?列表赋值结果疑问
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 11:45:03