66 条回复  ·  7073 次点击
94 初学 2025-10-27 12:00:18
@NotLongNil #50 ,这就不是深浅拷贝的问题。而是切片赋值的索引建立问题。 hello[2..<5] 提取索引 2 、3 、4 的元素也就是 [30, 40, 50], 那么按照正常理解 foo 就是: foo[0] = 30 (原 hello[2]) foo[1] = 40 (原 hello[3]) foo[2] = 50 (原 hello[4]) 对吧? 但是你去修改 foo[2] = 0 ,那么考虑的就是把旧的值 50 赋值成为新的值 0 ,对吧? 那么期望输出的应该就是 [30, 40, 0],但是 swift playground 中输出的是 [0, 40, 50]。 修改的是我们预期中 foo[0] 的值。也就是说 foo = hello[2..<5] 的操作并没有把索引重新编号。 换成 Java 可能会帮助你的理解: List originalList = new ArrayList<>(Arrays.asList(10, 20, 30, 40, 50, 60)); List sliceList = originalList.subList(2, 5); sliceList.set(2, 0); System.out.println(sliceList); 这样操作之后结果 sliceList 输出的是 [0, 40, 50]
NotLongNil 楼主 初学 2025-10-27 12:00:44
@Cabana #57 唉,你自己每一门语言去试一下吧。在修改 foo 之前先修改 hello 试试,看看是什么效果。至于为什么说深浅拷贝,有空有兴趣可以去了解下 swift 的 Array 和 ArraySlice 底层是怎么实现的,然后再看下 golang 的 slice 底层是怎么实现的。如果不想去看,那你就是对的,我在乱扯
cloudzhou 小成 2025-10-27 12:04:23
!!! @NotLongNil main 这个我不说了,swift 你到底有没有看问题?! “现在国内都是怎么培养程序员的,连基本的看题,理解能力都不行” 那个问题和深拷贝浅拷贝一点都没关系,而是数组下标索引的问题 a := [0, 1, 3] b := a[1:2] b[0] = 100 请问,深拷贝下,你认为 a, b 分别是多少 go 和 swift 设计上不一样的,大家质疑的是这一点
banmuyutian 小成 2025-10-27 12:07:03
第一个链接,修改 foo[2]实际改的是 hello[2]的值,真的不奇葩吗?
NotLongNil 楼主 初学 2025-10-27 12:07:32
@cloudzhou 我上面不是说了吗,让你看怎么实现的吗?如果你不去看,你就是对,我在胡扯,跟“深浅拷贝“没关系。
cloudzhou 小成 2025-10-27 12:11:38
@NotLongNil 我虽然不了解 swift ,但是刚才 ai 看了一下你说的 Array 和 ArraySlice 的实现 事实上 swift 设计的很合理,触发 cow ,避免很多很隐晦的 bug ,Golang 的设计就很底层了,slice 被其他途径修改了也不知道 但是问题不在这里,在于语法层面,就非常违反常识,无论是深拷贝浅拷贝 你这说半天以为大家都不知道什么是深拷贝浅拷贝吗
Cabana 小成 2025-10-27 12:19:08
@cloudzhou #65 哈哈, op 现在沉浸在自己的世界里了. 不用跟他辩了. 典型的 XY 问题, 我们在说 A, 他在说 B.
1234567
返回顶部