Julia 1.0 UndefVarError - 变量范围

Julia 1.0 UndefVarError - Scope of Variable

我正在从 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 = 1let 块。一些答案建议将所有代码放在 let 块中,但它会在逐行测试时引发其他问题,包括 UndefVarError 。有什么办法可以不用 let 阻塞吗?谢谢!

这是讨论

如下所示在 num 变量的循环内添加 global

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 在下面的回答中做出的出色评论:

Just remember that inside a function you won't use global, since the scope rules inside a function are as you would expect:

请参阅该答案,了解在没有作用域问题的情况下对相同代码使用函数的一个很好的示例。

请记住,您不会在函数内部使用 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