我正在从Julia 0.7升级到1.0。似乎Julia的变量范围规则从0.7更改为1.0。例如,我想运行一个像这样的简单循环:
num = 0
for i = 1:5
if i == 3
num = num + 1
end
end
print(num)
在Julia 0.7(以及大多数其他语言)中,我们可以期望循环后num = 1
。但是,它将在Julia 1.0中产生UndefVarError: num not defined
。我知道通过使用let
我可以做到
let
num = 0
for i = 1:5
if i == 3
num = num + 1
end
end
print(num)
end
它将打印出1。但是我确实想将num = 1
放在循环之外,并在let
块之外。一些答案建议将所有代码放在let
块中,但是在逐行测试时会引起其他问题,包括UndefVarError
。有什么方法可以代替使用let
阻止吗?谢谢!
答案 0 :(得分:2)
对此进行了讨论here。
在global
变量的循环内如下所示添加num
。
num = 0
for i = 1:5
if i == 3
global num = num + 1
end
end
print(num)
在Julia 1.0.0 REPL中运行:
julia> num = 0
0
julia> for i = 1:5
if i == 3
global num = num + 1
end
end
julia> print(num)
1
修改
对于来到Julia的新手,请注意vasja在以下答案中做出的出色评论:
请记住,在函数内部您不会使用全局函数,因为函数内部的作用域规则符合您的期望:
请参见该答案,这是在同一代码中使用函数而没有范围问题的一个很好的例子。
答案 1 :(得分:1)
请记住,在函数内部您不会使用global
,因为函数内部的作用域规则符合您的期望:
function testscope()
num = 0
for i = 1:5
if i == 3
num = num + 1
end
end
return num
end
julia> t = testscope()
1
意外行为仅在REPL中。 有关here
的更多信息