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

Arrays 在for循环中修改数组时的奇怪行为,arrays,for-loop,julia,Arrays,For Loop,Julia,看看这个例子: 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

看看这个例子:

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
应该是
任何[[-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)
,一切正常。还是想知道原因

朱莉娅有 e、 g.与MATLAB不同,Julia数组是通过引用指定的。引用是现有变量的别名或备用名称。例如,假设您将peter作为paul的参考(别名),您可以将此人称为peter或paul。
baz[i]=foo
之后,更改
foo
的元素也将修改
baz[i]

这是一个常见的陷阱,因为数组
foo
是一个绑定。约翰·迈尔斯·怀特(John Myles White)在这方面写了一篇非常好的博客文章:

顺便说一句,您应该尽量避免使用速度较慢的
任何
数组。您可以通过以下方式轻松完成此操作:

Array(typeof(v), 3)
或者只需输入显式类型的
v
,例如

Array(Vector{Int}, 3)
这里,
Vector{Int}
相当于(数组{Int,1}
的另一个名称)

还要注意的是,您可以使用nice
@show
:

julia> a = 3
3

julia> @show a
a = 3
3

@show
还返回显示的值。在Julia的早期版本中,输出看起来像
a=>3

,因此正确的方法是使用
deepcopy
,在本例中是
baz[i]=deepcopy(foo)
,用于“解耦”。这很有道理,非常感谢!这些材料真的非常有用,谢谢你的有用提示!