You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何两段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的操作方式,本质是引用传递与副本创建的不同:

  1. 首先,B=A这一步在两个版本中完全一致:变量B只是引用了数组A所在的内存地址,没有创建任何副本。

  2. 版本1的B[:,:]=B[:,:].+1:

    • B[:,:].+1会生成一个临时的新数组(这是副本),但后续的B[:,:]=...是原地赋值操作——它会把临时数组的内容写入B所引用的原数组内存(也就是A的内存)。因此每次循环都会直接修改A的值,三次循环后A累计加3。
  3. 版本2的B=B.+1:

    • 副本创建的时机就在B.+1这一步:这个操作会生成一个全新的数组副本,里面存储了B(也就是A)的元素加1后的结果。随后B=...只是把变量B的引用指向了这个新数组,完全没有触动原来的A数组。所以A自始至终没有被修改,最终输出初始值。

简单来说:版本1是修改原数组内容,版本2是让变量指向新的副本数组,原数组毫发无损。

内容的提问来源于stack exchange,提问作者L Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 01:27:17