如何在 Julia 中重新分配连接结果?

How to reassign result of concatenation in Julia?

我需要在 Julia 中创建 Vector 个预定义结构。截至目前,我正在尝试通过迭代连接来做到这一点:

struct Scenario
    prob::Float64 # probability
    time::Float64   # duration of visit
    profit::Int64 # profit of visit
end

possible_times = [60, 90, 120, 150, 180]
scenarios = Scenario[]

for point in 1:num_points
    profit = rand(1:4)
    new_scenario = [Scenario(0.2, possible_times[i], profit) for i=1:5]
    scenarios = vcat(scenarios, new_scenario)
    
end
display(scenarios)

但我得到了以下

Warning: Assignment to `scenarios` in soft scope is ambiguous because a global variable by the same name exists: `scenarios` will be treated as a new local. Disambiguate by using `local scenarios` to suppress this warning or `global scenarios` to assign to the existing global variable.
ERROR: LoadError: UndefVarError: scenarios not defined

那么第一个问题就是如何保存中间拼接的结果呢?第二个问题是实现目标的正确方法吗?还是我做错了还有别的办法?

通常使用append!代替vcat:

for point in 1:num_points
    profit = rand(1:4)
    new_scenario = [Scenario(0.2, possible_times[i], profit) for i=1:5]
    append!(scenarios, new_scenario)
end

如果您想使用 vcat,请使用 global 关键字:

for point in 1:num_points
    profit = rand(1:4)
    new_scenario = [Scenario(0.2, possible_times[i], profit) for i=1:5]
    global scenarios = vcat(scenarios, new_scenario)
end

要点是,在 scenarios = vcat(scenarios, new_scenario) 中,您重新分配了全局范围内的 scenarios 变量。

总的来说,情况有点复杂(Julia 的行为将取决于代码是 运行 交互式还是 non-interactive 会话),您可以在 this section 的 Julia 手册(本节中关于 Soft scope 的项目符号 3)。但是,如果您不想深入研究作用域的细节,一个简单而安全的规则是:如果您分配给一个全局变量,则在分配操作前加上 global.