2

我正在 Julia 中编写代码,该代码从函数中收集一些输出foo(它会改变其输入参数),并且我试图将来自该函数的递归评估附加到一个数组A中。

例如,通过添加到其每个元素来foo!(x)更改 的值。x1

function foo!(x)
    x .= x .+ 1
    return(x)
end


julia> x = [1, 1];

julia> foo!(x);

julia> x
2-element Array{Int64,1}:
 2
 2

我想创建一个数组A来存储x = f(x)超过固定范围的值。但是,A最终只会包含 的最终值的多个副本f(x),例如,

julia> x = [1, 1];

julia> A = [x];

julia> for i=1:3
           push!(A, foo!(x))
       end

julia> A
4-element Array{Array{Int64,1},1}:
 [4, 4]
 [4, 4]
 [4, 4]
 [4, 4]

我试图让它有效地输出类似于

julia> B
4-element Array{Array{Int64,1},1}:
 [1, 1]
 [2, 2]
 [3, 3]
 [4, 4]

我无法找到有用的资源来加深对突变的理解,或者在 Julia 中执行突变的顺序。在这方面的任何帮助将不胜感激!

4

2 回答 2

2

您编写它的方式,您重复push!将同一个对象放入A,您的foo!函数会对其进行变异:

julia> x = [1, 1]
2-element Vector{Int64}:
 1
 1

julia> A = [x]
1-element Vector{Vector{Int64}}:
 [1, 1]

julia> foo!(x)
2-element Vector{Int64}:
 2
 2

julia> A
1-element Vector{Vector{Int64}}:
 [2, 2]

解决此问题的一种方法是对before中copy的元素进行突变:Ax

julia> for i ∈ 1:3
           A[i] = copy(x)
           push!(A, foo!(x))
       end

julia> A
4-element Vector{Vector{Int64}}:
 [1, 1]
 [2, 2]
 [3, 3]
 [4, 4]

可以在此处找到有关值与绑定的经典读物。

于 2021-04-06T05:00:13.033 回答
1

通过仅使用push!,您只是创建了对单个数组(即x)的引用数组。这就是为什么您会看到多次重复相同的值。

如果要保留x跨调用的值的副本,foo!可以使用copy

julia> foo!(x) = x .+= 1
foo! (generic function with 1 method)

julia> x = [0,0];

julia> A = [copy(foo!(x)) for i in 1:4]
4-element Vector{Vector{Int64}}:
 [1, 1]
 [2, 2]
 [3, 3]
 [4, 4]

于 2021-04-06T04:59:45.223 回答