请问为什么赋值整体运行的时候会出错

这段code如果是先分开运行了while前的iteration赋值,再分开运行下面的while loop就没问题。但是如果是整个程序一起运行就会报错,请问这是为什么?

iteration = 0
PRpolicy_times = []
eval_times = []
policy_old = copy(policy)
total_time = 0.0
iter_time = 0.0
imp_time = 0.0
n_diff = Inf

while n_diff != 0 && total_time < 60
    iteration += 1

    。。。。。。。。
end

因为Julia在interactive run和执行脚本的时候是有区别的,主要针对变量的定义域。在interactive mode下面所有的变量都默认是全局的,但在脚本中并非如此。

test.jl:

iteration = 0
total_time = 0

while total_time < 10
   total_time += 1
   iteration += 1
end
julia> include("test.jl")
┌ Warning: Assignment to `total_time` in soft scope is ambiguous because a global variable by the same name exists: `total_time` will be treated as a new local. Disambiguate by using `local total_time` to suppress this warning or `global total_time` to assign to the existing global variable.
┌ Warning: Assignment to `iteration` in soft scope is ambiguous because a global variable by the same name exists: `iteration` will be treated as a new local. Disambiguate by using `local iteration` to suppress this warning or `global iteration` to assign to the existing global variable.
ERROR: LoadError: UndefVarError: total_time not defined

如果你把这段封装在函数里面就不会报错了;或者按照Julia的提示,指明变量是global。详情请参考官方文档Variable Scopes。对于你这里的情况,一般的建议都会是尽量考虑写在函数里面,避免使用global variables。

另外,你没有显示Warning,说明这肯定不是Julia 1.6,该升级了。

2 个赞

谢谢你回复我!看了你的回复我在while里面用到的变量加了global就可以了!原来while和其他for什么的判定不一样的,里面的变量是local的

Julia1.6的问题我没看懂,因为vscode底下显示是Julia ver1.6,不知道你说的显示warning应该是怎么回事

再次谢谢你!学到了!

不是的。用for loop也会有一样的问题。加global是可行的,但如果你想要更快的速度,建议写在函数里,这样就不需要global keyword了。