Julia 1.0 UndefVarError - 变量作用域问题

3

我正在从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。但我想在循环外和let块之外获取num = 1。一些答案建议将所有代码放在let块中,但这会导致其他问题,包括逐行测试时的UndefVarError。有没有其他方法而不是使用let块?谢谢!
2个回答

3

这里讨论了这个问题

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在答案中所做的优秀评论:

请记住,在函数内部,您不会使用global,因为函数内部的作用域规则与您所期望的相同:

查看该答案以了解如何使用函数来执行相同的代码而不会出现作用域问题。


可以了!谢谢!我之前把全局变量放在循环外面,所以不起作用。 - LIN ZHAO
1
“看起来 Julia 变量作用域的规则从0.7版本到1.0版本发生了变化”这句话简直是年度轻描淡写之语!!! - Steven Siew
@StevenSiew 是的,你说得一点没错! - Julia Learner
如果问题已经被其他Stack Overflow的问题/答案完全回答,那么在评论中应该将OP引导到那里吗? - rickhg12hs
好的评论。我也在考虑这个问题。然而,如果有人对一门语言还不熟悉,有时候一个关于具体代码的确切答案比一个更一般性的答案更容易理解。例如,你提供了Dr. Strangedupe: Or, How I Learned to Stop Worrying And Love Duplication。这是我第一个真正在stackoverflow上做任何事情的月份(除了几年前用R语言做过一点)。谢谢。PS:(我提供了一个链接,但没有提到重复。) - Julia Learner

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中。 更多信息在这里

1
哦,谢谢!这很有帮助,因为我确实在编写函数。但在我完成整个函数之前,我必须通过逐行测试来确保那些中间步骤有效,这让我感到困扰,在这种情况下,我需要使用 global,但是如果我没有在准备调用函数时删除那些 global,就会产生语法错误。 - LIN ZHAO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接