
1. 用浅拷贝copy()的场景浅拷贝的核心逻辑是我只关心最外层数据独立里面的东西我不管。场景一替换顶层元素常见你只想修改列表的第一个元素或者删除字典里的某个键但不修改内部嵌套的小列表或小字典。vim 配置列表每一行是一个配置项let config [header, [sub1, sub2], footer] 想创建一个新配置只把 header 改成 new_headerlet new_config copy(config)let new_config[0] new_header 现在 new_config 是 [new_header, [sub1, sub2], footer] 嵌套子列表仍然共享但你的操作根本没动它所以很安全场景二性能敏感且只读嵌套数据如果你的数据结构很大比如几千行日志而且你只打算读取嵌套部分的内容从不修改那么浅拷贝效率更高只复制最外层内存和时间开销小。场景三传参时想隔离顶层修改把列表传给一个函数你怕这个函数会把整个列表替换掉let list []但不在意它修改列表内部某个元素。这时候浅拷贝就够了。2. 用深拷贝deepcopy()的场景深拷贝的核心逻辑是我要一份完全独立的备份改你的绝不影响我的。场景一修改嵌套数据最关键这是最常见的坑。只要你的操作涉及到修改嵌套的列表或字典比如 list[1][0] x就必须用深拷贝。vim 用户数据包含个人信息和订单列表let user {name: alice, orders: [101, 102]} 你想在函数里给 orders 追加一个新订单function! AddOrder(user, new_id)let new_user deepcopy(a:user) 必须深拷贝call add(new_user.orders, a:new_id)return new_userendfunctionlet new_user AddOrder(user, 103)echo user.orders [101, 102] 原用户不受影响echo new_user.orders [101, 102, 103] 新用户有追加如果用 copy()new_user.orders 和 user.orders 是同一个列表追加操作会污染原始数据。场景二防御性编程确保无副作用当写一个公共函数库给别人用或者写 Vim 插件时无法预知调用者是否会在后面修改内部数据。为了绝对安全对传入的数据做 deepcopy 是最稳妥的。场景三缓存或状态快照你需要保存某个时刻的数据状态比如撤销历史、游戏存档之后可能会回滚。这时候必须深拷贝确保快照和当前数据完全脱钩。3. 什么时候两者都不用直接赋值 直接赋值只是传引用适用于你就是要修改同一个对象的场景。vim 你想要全局配置和局部配置联动修改let global_opts {theme: dark, font: 12}let local_opts global_opts 直接赋值let local_opts.font 14echo global_opts.font 输出 14联动修改正是你想要的需要复制一个列表/字典吗 │ ├── 希望修改副本时不影响原数据 │ │ │ ├── 只修改顶层元素如 list[0] x │ │ └── ✅ 用 copy()浅拷贝 │ │ │ └── 会修改嵌套元素如 list[0][1] x │ └── ✅ 用 deepcopy()深拷贝 │ └── 希望修改副本时原数据也跟着变 └── ✅ 直接赋值不拷贝