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)
,用于“解耦”。这很有道理,非常感谢!这些材料真的非常有用,谢谢你的有用提示!