Julia 1.0 UndefVarError-变量范围

时间:2018-09-19 00:24:26

标签: for-loop scope julia scoping

我正在从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阻止吗?谢谢!

2 个答案:

答案 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

的更多信息