66 条回复  ·  7080 次点击
NotLongNil 楼主 初学 2025-10-27 11:31:39
@PlG5sBkXD1ziLeGB 哪有什么直觉,这是语言设计的就是如此啊。go 的切片也是浅拷贝,但是在修改时会进行深拷贝。你可以试着改下 hello 数组,看 foo 会不会变。swift 在修改时不进行深拷贝。这只是不同语言之间的设计差异
NotLongNil 楼主 初学 2025-10-27 11:34:37
@ltmst 大部分语言类似切片的设计都是浅拷贝,这个设计是基于性能考量的,你们可以改下源数组看看。上面有人说到 golang ,golang 在修改值时,会在底层进行深拷贝。
NotLongNil 楼主 初学 2025-10-27 11:37:54
@Cabana 你说的底层设计逻辑,其实就是 深浅拷贝 的概念。
qiuhang 小成 2025-10-27 11:39:25
第一个设计逻辑就是屎,跟踏马深浅拷贝什么关系。你哪怕就是按照 c/c++系直接操作数组指针那套最基础的逻辑去理解,它 foo 也因该是拿到 hello+2 的地址。
NICEghost 初学 2025-10-27 11:43:36
全是靠自学的,大家不都是明白人吗?当年怎么培养你的?
NotLongNil 楼主 初学 2025-10-27 11:44:57
@caiqichang 所有语言的类似操作基本都是一个浅拷贝。但是修改 foo 数组时,大部分语言都会进行一次深拷贝后才修改。其他语言的设计,很容易让人误以为是深拷贝,但是你们在修改 foo 前,先修改 hello 数组看看。
NotLongNil 楼主 初学 2025-10-27 11:49:46
@NICEghost 这么说吧,我们当年是要研究一门语言为什么要这样设计,它是怎么实现的,最后自己试着写一门超级简单的新语言。
Cabana 小成 2025-10-27 11:54:30
@NotLongNil #52 首先不是所有的语言设计 slice 都是浅拷贝的. 另外就算同一个语言针对基础类型和对象 slice 的行为也可能不一样. 你标题说的"后有深拷贝浅拷贝都不理解", 看哪个帖子明明大家都是在吐槽, swift 的 slice 设计的行为和大多数人预想的不一致. swift 的这个示例迷惑性在于, 大家纠结的点是在 Array 和 ArraySlice 的索引问题, 你非得往深浅拷贝这扯~
ys2016814 小成 2025-10-27 11:58:43
标题党,引流贴,无任何营养, 建议下沉。
shenlanAZ 小成 2025-10-27 11:59:02
第一个是 swift 的语法问题吧,他拷贝了吗?这叫引用吧。rust 也会借用,但是你不能再通过借用的类型再去访问原始不可变的值了(比如原始指针什么的)。 --- fn main() { let mut hello = [10, 20, 30, 40, 50, 60]; // 将数组声明为可变 let foo = &mut hello[2..5]; // 获取一个可变切片 foo[2] = 0; // 修改切片中的元素 println!("{:?}", foo); // 输出切片 println!("{:?}", hello); // 输出修改后的数组 } --- [30, 40, 0] [10, 20, 30, 40, 0, 60] --- 没有人比我更懂程序员?
返回顶部