Обновите и сохраните глобальный массив Julia с помощью! Push - PullRequest
0 голосов
/ 14 января 2019

Я немного озадачен тем, как 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

Я явно что-то упускаю.

1 Ответ

0 голосов
/ 14 января 2019

Вы помещаете один и тот же массив 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. Поэтому, если вы измените varpush! или индексированным назначением или чем-то подобным), то независимо от того, как вы к нему обращаетесь, вы увидите эти изменения.

Этого не происходит с числами, потому что вы не можете сами изменять числа. Вы можете изменить , номер которого хранится в массиве, но вы не можете изменить номер 1 для представления 2 везде, где 1 ранее использовался - это эквивалент того, что здесь происходит.

Чтобы исправить это, вам часто нужно просто создать массив var внутри цикла for (а не снаружи). Но в этом случае, поскольку вы итеративно добавляете вещи в 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]
...