Julia

时间:2017-01-25 21:14:54

标签: scope julia

我有一个输入文件,其中定义了一些变量。对于循环中的每次迭代,我想读取文件,更新一些变量的值,然后运行计算。

我有一个名为input.jl的输入文件

myval=1

然后我有一个带有以下命令的文件myscript.jl

for i=1:2
    include("input.jl")
    println(myval)
    myval=2
end

如果我运行该文件(julia myscript.jl),则会收到myval未定义的错误。如果我注释掉第三行或第四行,那么它运行没有问题。如果我删除for循环,三行运行没有问题。如何从input.jl中读取myval,使用它,然后在循环的每次迭代期间更新其值?

1 个答案:

答案 0 :(得分:1)

不幸的是,似乎include函数在全局范围内执行事物,然后从它停止的地方继续。因此,如果您尝试将新变量动态include放入本地范围,则不是这样做的。

您可以在全局范围首先引入变量,以便该函数可以访问它,因此赋值将起作用(但是,请注意该变量将在全球范围)。

您可以先将输入文件包装到模块中作弊。您仍然需要按名称调用变量,并且您将收到有关更新模块的警告,但这样您至少可以动态更新本地变量,而无需在全局范围内使用该变量: / p>

# in input.jl
module Input
  myval  = 1;
end

# in your main file
for i=1:2
  include("input.jl")
  myval = Input.myval;
  println(myval)
  myval=2
end

您可以添加一个单独的流程并将计算卸载到全局范围,并在本地将其检索到当前流程,例如。

# in file input.jl
myval = 1

# in main file
addprocs(1);

for i=1:2
    myval = remotecall_fetch(() -> (global myval; include("input.jl"); myval), 2);
    println(myval)
    myval=2
end