// 这是一段 swift 代码
var hello = [10, 20, 30, 40, 50, 60]
var foo = hello[2..<5] // 表示索引范围是 2 ,3 ,4
foo[2] = 0
print(foo)
// 先看看你的程序员直觉,输出结果是什么
然后随便 google 找个 swift playground 运行这段代码,你就知道为什么苹果现在 bug 越来越多了。
103
freedomin 2 天前
结果要是[20, 0, 40]我还勉强能理解,[0, 40, 50]我是真理解不了
|
106
volvo007 2 天前 via iPhone
@XIVN1987 我 py 白学了😂,你是对的。哪个语言会两边都改来着? go ?我试了下 np 下切片和原数组是一样的,当然这是另一种实现了
>>> a = np.arange(0,100,10) >>> a array([ 0, 10, 20, 30, 40, 50, 60, 70, 80, 90]) >>> b = a[4:7] >>> b array([40, 50, 60]) >>> b[0] = 0 >>> b array([ 0, 50, 60]) >>> a array([ 0, 10, 20, 30, 0, 50, 60, 70, 80, 90]) |
108
HtPM 1 天前
其实并不反直觉,这是底层性能优化而已,数组赋值肯定是赋值的底层指针(引用)呀,不管是 java ,c 还是 c++,这都是默认行为。如果按照你的直觉:所有对象赋值都是新建一份内存然后深拷贝,那栈不得爆了?虽然我对 swift 的语法没你那么熟,但语言都是相通的。
|