Vimscript copy() deepcopy() 在 Vimscript 中copy() 和 deepcopy() 是处理列表List和字典Dictionary时实现浅拷贝与深拷贝的核心函数。这个区别的关键在于拷贝是否会“传染”给容器内部的子对象。引用与拷贝为什么需要它们在 Vimscript 中列表和字典变量存储的是对数据对象的引用可以理解为指针而不是数据本身。这意味着当你直接赋值时两个变量指向的是同一个数据实体修改其中一个另一个也会同步变化。这类似于创建了一个“别名”let l [1, [a, b], 2]let m l m 和 l 指向同一个列表let l[0] 99echo m[0] 输出 99因为 m 和 l 是同一个列表为了避免这种“牵一发而动全身”的副作用我们需要创建数据副本。浅拷贝copy()copy() 函数用于创建一个浅拷贝。# 行为它会创建一个新的容器列表或字典并复制原容器中所有顶层元素的值或引用。# 关键影响如果容器内的元素本身是引用类型如嵌套的列表或字典copy() 只会复制这个引用。因此原容器和副本会共享这些嵌套的子对象。修改副本内的嵌套子对象会影响到原容器深拷贝deepcopy()deepcopy() 函数则进行深拷贝。# 行为它会创建一个全新的容器并递归地复制原容器中的所有内容。对于遇到的每一个嵌套的子列表、子字典deepcopy() 都会创建一份独立的副本。# 关键影响因为所有的嵌套结构都被完整复制所以原容器和副本是完全独立的。修改任何一方的任何层次元素都不会影响到另一方清晰地展示了两者的区别let l [1, [a, b], 2]let sc copy(l) 浅拷贝let dc deepcopy(l) 深拷贝 修改原列表的顶层元素let l[2] 3 修改原列表中的嵌套列表元素let l[1][0] z 查看浅拷贝 scecho sc[2] 输出 2顶层元素独立不受影响echo sc[1][0] 输出 z嵌套子对象被共享受到了影响 查看深拷贝 dcecho dc[2] 输出 2顶层元素独立echo dc[1][0] 输出 a嵌套子对象完全独立不受任何影响应用场景函数式编程deepcopy() 常被用来在函数中避免“副作用”即修改传入的参数。例如你想对一个列表排序但又不希望改动原列表可以这样做function! Sorted(l) 先 deepcopy 一份再排序副本let new_list deepcopy(a:l)call sort(new_list)return new_listendfunctionlet mylist [3, 1, 4, 1, 5]echo Sorted(mylist) 输出 [1, 1, 3, 4, 5]echo mylist 输出 [3, 1, 4, 1, 5] 原列表未被改动