foo = [1,2] 2-element Array{Int64,1}: 1 2 julia> baz =-6ren">
gpt4 book ai didi

arrays - 在 for 循环中修改数组时的奇怪行为

转载 作者:行者123 更新时间:2023-12-02 03:29:45 25 4
gpt4 key购买 nike

看一下这个例子:

julia> VERSION
v"0.4.0-rc1"

julia> foo = [1,2]
2-element Array{Int64,1}:
1
2

julia> baz = Array(Any,3)
3-element Array{Any,1}:
#undef
#undef
#undef

julia> for i = 1:3
foo[1] = -foo[1]
baz[i] = foo
println("loop",i)
println("foo: ",typeof(foo),"->",foo)
println("baz[",i,"]: ",typeof(baz[i]), "->", baz[i])
println("baz: ",typeof(baz),"->",baz)
end

loop1
foo: Array{Int64,1}->[-1,2]
baz[1]: Array{Int64,1}->[-1,2]
baz: Array{Any,1}->Any[[-1,2],#undef,#undef]
loop2
foo: Array{Int64,1}->[1,2]
baz[2]: Array{Int64,1}->[1,2]
baz: Array{Any,1}->Any[[1,2],[1,2],#undef]
loop3
foo: Array{Int64,1}->[-1,2]
baz[3]: Array{Int64,1}->[-1,2]
baz: Array{Any,1}->Any[[-1,2],[-1,2],[-1,2]]

结果出乎我的意料,我认为baz应该是Any[[-1,2],[1,2],[-1,2]]

但是,如果 foo 不是数组,则结果是合理的。

julia> foo = 1
1

julia> baz = Array(Any,3)
3-element Array{Any,1}:
#undef
#undef
#undef

julia> for i = 1:3
foo = -foo
baz[i] = foo
println("loop",i)
println("foo: ",typeof(foo),"->",foo)
println("baz[",i,"]: ",typeof(baz[i]), "->", baz[i])
println("baz: ",typeof(baz),"->",baz)
end
loop1
foo: Int64->-1
baz[1]: Int64->-1
baz: Array{Any,1}->Any[-1,#undef,#undef]
loop2
foo: Int64->1
baz[2]: Int64->1
baz: Array{Any,1}->Any[-1,1,#undef]
loop3
foo: Int64->-1
baz[3]: Int64->-1
baz: Array{Any,1}->Any[-1,1,-1]

我的问题是这里发生了什么,在 for 循环中分配数组的正确方法是什么?

编辑:我添加了baz = deepcopy(baz),一切顺利。还是想知道原因。

最佳答案

Julia 有 Noteworthy Differences from other Languages例如与 MATLAB 不同,Julia 数组是通过引用分配的。引用是现有变量的别名或替代名称。例如,假设您将 peter 设置为 paul 的引用(别名),则可以将该人称为 peter 或 paul。在 baz[i] = foo 之后,更改 foo 的元素也会修改 baz[i]

关于arrays - 在 for 循环中修改数组时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32793390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com