茱莉亚的意外行为

时间:2019-07-14 08:24:20

标签: julia

我刚开始使用来自Python的Julia并正在做一些实验。

我想创建一个数组,该数组是由循环内的函数产生的一系列5个数组,我假设我误解了for循环或push函数的工作方式。我试过了append函数,但随后您在coords数组中得到了一个元素数组。

trj = []

for i in 1:n
    coords = run(coords, vels)
    println(coords)
    push!(trj, coords)
end

println()
println(trj)

这是我得到的输出:

Any[[0.0806422, 0.785333, 0.942802], [0.0510982, 0.716546, 0.620131], [0.357414, 0.448247, 0.386514]]
Any[[0.265953, 0.785003, 0.898467], [0.230179, 0.729533, 0.656178], [0.260246, 0.571314, 0.302354]]
Any[[0.451263, 0.784673, 0.854133], [0.40926, 0.74252, 0.692224], [0.163079, 0.694381, 0.218195]]
Any[[0.636573, 0.784342, 0.809798], [0.588342, 0.755507, 0.72827], [0.065912, 0.817448, 0.134035]]
Any[[0.821884, 0.784012, 0.765463], [0.767423, 0.768494, 0.764317], [0.968745, 0.940515, 0.0498756]]

Any[Any[[0.821884, 0.784012, 0.765463], [0.767423, 0.768494, 0.764317], [0.968745, 0.940515, 0.0498756]], Any[[0.821884, 0.784012, 0.765463], [0.767423, 0.768494, 0.764317], [0.968745, 0.940515, 0.0498756]], Any[[0.821884, 0.784012, 0.765463], [0.767423, 0.768494, 0.764317], [0.968745, 0.940515, 0.0498756]], Any[[0.821884, 0.784012, 0.765463], [0.767423, 0.768494, 0.764317], [0.968745, 0.940515, 0.0498756]], Any[[0.821884, 0.784012, 0.765463], [0.767423, 0.768494, 0.764317], [0.968745, 0.940515, 0.0498756]]]

如您所见,trj数组只是coords乘以5的最后一个版本,而不是5个产生的coords数组中的一系列。

1 个答案:

答案 0 :(得分:2)

坐标中只有一个元素副本,并使用run()函数修改这些元素。这是Julia约定将变元函数以!命名的原因之一,例如run!(coords,vels),以提醒您这一点。我建议您更改run()以修改其参数的副本并返回它,但是如果您不想这样做,则可以这样做:

trj = Vector{Vector{Vector{Float64}}}()

for i in 1:n
    coords = run(coords, vels) # should be called run!
    println(coords)
    push!(trj, deepcopy(coords))
end

println()
println(trj)

deepcopy()在向量中获取新元素,因此下一次对coords()的调用不会覆盖它们。