Julia:关于变量绑定、变异和可变函数的问题

问题描述

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

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

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]

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

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

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

解决方法

按照您编写它的方式,您将同一个对象反复 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]

解决此问题的一种方法是在 copy 发生变异之前 A x 中的元素:

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]

可以找到关于值与绑定的经典阅读here

,

通过仅使用 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,4]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...