这段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了。