为何两段Julia代码输出结果不同?版本2何时创建副本?
Julia两段代码输出差异的原因解析
版本1代码及输出
A=[1 2;3 4] for ii in 1:3 B=A B[:,:]=B[:,:].+1 end display(A)
输出:
2×2 Array{Int64,2}: 4 5 6 7
版本2代码及输出
A=[1 2;3 4] for ii in 1:3 B=A B=B.+1 end display(A)
输出:
2×2 Array{Int64,2}: 1 2 3 4
核心差异解析
两段代码的关键区别在于对B的操作方式,本质是引用传递与副本创建的不同:
首先,
B=A这一步在两个版本中完全一致:变量B只是引用了数组A所在的内存地址,没有创建任何副本。版本1的
B[:,:]=B[:,:].+1:B[:,:].+1会生成一个临时的新数组(这是副本),但后续的B[:,:]=...是原地赋值操作——它会把临时数组的内容写入B所引用的原数组内存(也就是A的内存)。因此每次循环都会直接修改A的值,三次循环后A累计加3。
版本2的
B=B.+1:- 副本创建的时机就在
B.+1这一步:这个操作会生成一个全新的数组副本,里面存储了B(也就是A)的元素加1后的结果。随后B=...只是把变量B的引用指向了这个新数组,完全没有触动原来的A数组。所以A自始至终没有被修改,最终输出初始值。
- 副本创建的时机就在
简单来说:版本1是修改原数组内容,版本2是让变量指向新的副本数组,原数组毫发无损。
内容的提问来源于stack exchange,提问作者L Y
相关产品推荐
相关产品推荐

