【问题标题】:Update and store a global Julia array with !push使用 !push 更新和存储全局 Julia 数组
【发布时间】:2019-06-08 18:06:35
【问题描述】:

我对 Julia 1.0.3 处理全局变量的方式有些疑惑。有没有办法使用 !push 来更新全局数组?

在玩REPL的时候,我想更新一个全局变量,然后push!把结果放到一个全局数组中存储。

var = [1]
res = []

for i in 1:5
  global var
  global res
  push!(var,i)
  print(string(var,"\n"))
  push!(res,var)
end

但是,res 中存储的值如下:

 [1, 1, 2, 3, 4, 5]
 [1, 1, 2, 3, 4, 5]
 [1, 1, 2, 3, 4, 5]
 [1, 1, 2, 3, 4, 5]
 [1, 1, 2, 3, 4, 5]

而我希望这样:

[1, 1]
[1, 1, 2]
[1, 1, 2, 3]
[1, 1, 2, 3, 4]
[1, 1, 2, 3, 4, 5]

特别令人费解,因为行为似乎与变量而不是数组的预期一致:

var = 1
res = []

for i in 1:5
  global var
  global res
  var = var + i
  print(string(var,"\n"))
  push!(res, var)
end

这给出了预期的结果:

  2
  4
  7
 11
 16

我显然错过了一些东西。

【问题讨论】:

    标签: arrays julia push global read-eval-print-loop


    【解决方案1】:

    您将相同的var 数组推送到res 数组中的每个位置。例如:

    julia> var = [1]
    1-element Array{Int64,1}:
     1
    
    julia> res = [var, var]
    2-element Array{Array{Int64,1},1}:
     [1]
     [1]
    
    julia> var[1] = 2
    2
    
    julia> res
    2-element Array{Array{Int64,1},1}:
     [2]
     [2]
    

    res 数组中的两个元素都是 var 本身。因此,如果您修改 var(使用 push! 或索引分配等),那么无论您如何访问它,您都会看到这些修改。

    数字不会发生这种情况,因为您不能自己修改数字。您可以更改 哪个 数字存储在数组中,但您不能将数字 1 更改为在以前使用过 1 的任何地方表示 2 — 这与此处发生的情况相同。

    要解决此问题,您通常只想在 for 循环内(而不是在循环外)创建 var 数组。但在这种情况下,由于您正在迭代地向var 添加内容并希望保存该中间状态,您可以使用copy

    julia> for i in 1:5
             global var
             global res
             push!(var,i)
             print(string(var,"\n"))
             push!(res,copy(var))
           end
    Any[1]
    Any[1, 2]
    Any[1, 2, 3]
    Any[1, 2, 3, 4]
    Any[1, 2, 3, 4, 5]
    
    julia> res
    5-element Array{Any,1}:
     Any[1]
     Any[1, 2]
     Any[1, 2, 3]
     Any[1, 2, 3, 4]
     Any[1, 2, 3, 4, 5]
    

    【讨论】:

      猜你喜欢
      • 2014-06-09
      • 2016-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-16
      • 2016-09-04
      • 2017-01-15
      • 2019-12-03
      相关资源
      最近更新 更多