提问人:Rodolfo 提问时间:9/24/2023 最后编辑:Rodolfo 更新时间:9/24/2023 访问量:63
在赋值“b = a”之后,在 Julia 中更改“a”何时也会更改“b”,何时不会更改?
After the assignment "b = a", when does changing "a" in Julia also changes "b" and when it does not?
问:
假设我在 Julia 中运行了作业。然后我改变.b = a
a
在什么情况下会自动更改,何时不会更改?b
笔记
在 Julia 中使用 = 运算符创建副本的答案涵盖了相同的中心主题,但含义不同,示例较少。这个问题似乎没有出现在已经知道作业不是 Julia 的“副本”的人的搜索中。(我写了我的问题和答案,因为它没有出现在我自己的搜索中。对于这些人,我的问题将是有用的。此外,答案更容易理解,并参考了末尾的链接问题。
问题中“改变”的使用是故意模棱两可的。它反映了“(在)分配(......和突变“,如 https://docs.julialang.org/en/v1/manual/variables/#man-assignment-expressions:~:text=A%20common%20confusion%20is%20the%20distinction%20between%20assignment%20(giving%20a%20new%20%22name%22%20to%20a%20value)%20and%20mutation中所述。
答:
分配与突变
假设,在运行赋值后,我们运行赋值。和 都是指向数组所在的内存中同一空间的名称。(链式赋值会产生相同的效果。a=[1,2,3]
b=a
a
b
[1,2,3]
b=a=[1,2,3]
突变将可变结构更改为 。现在,两者都引用了新值。a[1] = 42
[1,2,3]
[42,2,3]
a
b
[42,2,3]
后续赋值不会更改数组 。它只是将名称绑定到位于单独内存位置的不同对象(标量)。该数组仍可通过名称 访问。因此,执行使 REAPL 显示 ,执行使 REAPL 显示 。a = 3.14159
[42,2,3]
a
[42,2,3]
b
a
3.14159
b
[42,2,3]
因此,在 之后,其中 是可变结构,元素的任何突变都会影响 返回的值。如果 中的更改不是突变,而是为名称分配一个单独的值,则 b 返回的值继续相同。此外,如果所有元素本身都发生了变化,那么 返回的可变结构的元素也会发生变化。例:b=a
a
a
b
a
a
a
b
x = [1 2 3] ;
y = x ;
x .= [4 5 6]; # Broadcasting changes the elements. The name x is not bound to a separate array.
julia> print(x)
[4 5 6]
julia> print(y)
[4 5 6] # Therefore, y returns the same array with modified elements.
将上一个代码块与下一个代码块进行比较:
x = [1 2 3] ;
y = x ;
x = [4 5 6]; # Julia binds the name x to a separate array.
julia> print(x)
[4 5 6]
julia> print(y)
[1 2 3] # Therefore, Julia did not modify the array y refers to.
请阅读 Julia 的一位创建者对在 Julia 中使用 = 运算符创建副本的答案。
评论
a
a = [4 5 6]
a .= [4 5 6]
=
.=