julia - Julia 更新变量
问题描述
我只是想知道,为什么 Julia 会输出以下内容
a = [1,2,3]
b = a
b.+=[5,5,5]
然后变量 a 也被更新,所以在代码运行之后a=[6,7,8]
。
为什么是这样?如果最后一行是b+=[5,5,5]
,则 a 不会更新并保持不变a=[1,2,3]
解决方案
b = a
不会创建副本,而只是将标签b
指向 . 引用的对象a
。当您这样做时b = something_else
,您只需重新分配标签b
以指向其他内容。但是,一旦您更改了其中的元素b
(即不是绑定),您也在更改a
,因为它们都指向同一个底层对象。您甚至不需要+=
看到这一点,只需定期分配即可:
julia> a = [1,2,3];
julia> b = a;
julia> b = 5;
julia> a
3-element Vector{Int64}:
1
2
3
julia> b = a;
julia> b[1] = 10;
julia> a
3-element Vector{Int64}:
10
2
3
.+=
现在和之间的区别在于+=
这b += [5, 5, 5]
意味着b = b + [5, 5, 5]
,即您本质上是在做b = [6, 7, 8]
,从而替换了 的绑定b
。如果你这样做b .+= [5, 5, 5]
了,你就是在按元素广播赋值,也就是说你正在改变 中的每个元素b
,而不是b
指向的对象(保存你的整数的向量),在这种情况下它仍然与a
.
推荐阅读
- python - 如何有效地向前/向后一半填充数据帧中的空白?
- javascript - 在不知道项目名称的情况下循环遍历 javascript 对象
- python - 如何在 Python 中读取 txt 文件的特定部分?
- javascript - 未定义的属性“播放”
- javascript - 不能同时使用 DRAGGABLE、RESIZEABLE 和 SELECTABLE
- c# - 如何在 gridview C# .net 中以编程方式添加控制单元?
- node.js - Keycloak 策略执行器仅承载客户端
- c# - 我可以在 C# 中创建 int.FromBytes(byte[] bytes) 扩展方法吗?
- packer - 设置自定义 VPC、子网和安全组时 Packer SSH 超时
- android-studio - 为什么我会收到消息:冗余覆盖方法?