You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中拷贝字典后删除副本元素为何会影响原字典

问题原因

Python字典自带的copy()方法是浅拷贝,只复制字典最外层的键值映射关系,不会递归复制字典里存的可变类型值。
你的代码里字典的值全是set集合,属于可变对象,浅拷贝得到的新字典graph和原字典ugraph里,相同键指向的是内存里同一个集合对象,根本不是独立的副本。这时候你调用graph[0].remove(1),改的是两个字典共享的那个集合,原字典的对应值当然会跟着变。

补充:浅拷贝不是完全不能用,如果字典里存的全是整数、字符串、不带可变元素的元组这类不可变类型,用copy()不会有问题。只有当值包含列表、集合、嵌套字典、自定义可变实例这类对象时,才会出现修改副本牵连原对象的情况。

正确拷贝方案

根据使用场景二选一即可:

  • 通用场景:用标准库copy模块的deepcopy()做深拷贝,它会递归复制所有层级的对象,新字典和原字典完全独立,不管改哪一层的内容都不会互相影响
    import copy
    
    ugraph = {0: {1}, 1: {0, 2}, 2: {1, 3}, 3: {2}}
    graph = copy.deepcopy(ugraph)
    graph[0].remove(1)
    print(ugraph) 
    # 输出:{0: {1}, 1: {0, 2}, 2: {1, 3}, 3: {2}},原字典不受任何影响
    
  • 结构固定场景:如果你明确知道字典里值的类型,手动给每个值做一层拷贝就行,性能比深拷贝更好。比如你的场景里值全是集合,直接用字典推导式生成新字典即可:
    ugraph = {0: {1}, 1: {0, 2}, 2: {1, 3}, 3: {2}}
    graph = {k: v.copy() for k, v in ugraph.items()}
    graph[0].remove(1)
    print(ugraph)
    # 输出:{0: {1}, 1: {0, 2}, 2: {1, 3}, 3: {2}},原字典不受影响
    

内容的提问来源于stack exchange,提问作者user3141181

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:54:21