Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop Julia 1.0 UndevarError-变量范围_For Loop_Scope_Julia_Scoping - Fatal编程技术网

For loop Julia 1.0 UndevarError-变量范围

For loop Julia 1.0 UndevarError-变量范围,for-loop,scope,julia,scoping,For Loop,Scope,Julia,Scoping,我正在从0.7升到1.0。Julia的变量范围规则似乎从0.7变为1.0。例如,我想运行一个简单的循环,如下所示: num=0 对于i=1:5 如果i==3 num=num+1 终止 终止 打印(个) 在Julia 0.7(以及大多数其他语言)中,我们可以在循环之后使用num=1。但是,它将导致Julia 1.0中未定义的UndefVarError:num。我知道通过使用let我可以做到这一点 let num=0 对于i=1:5 如果i==3 num=num+1 终止 终止 打印(个) 终止

我正在从0.7升到1.0。Julia的变量范围规则似乎从0.7变为1.0。例如,我想运行一个简单的循环,如下所示:

num=0
对于i=1:5
如果i==3
num=num+1
终止
终止
打印(个)
在Julia 0.7(以及大多数其他语言)中,我们可以在循环之后使用
num=1
。但是,它将导致Julia 1.0中未定义的
UndefVarError:num
。我知道通过使用
let
我可以做到这一点

let
num=0
对于i=1:5
如果i==3
num=num+1
终止
终止
打印(个)
终止
它将打印出1。但是我确实想把
num=1
放在循环和
let
块之外。一些答案建议将所有代码放在
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在下面的回答中的精彩评论值得注意:


请记住,在函数中您不会使用全局,因为函数中的作用域规则与您预期的一样:

function testscope()
    num = 0
    for i = 1:5
        if i == 3
            num = num + 1
        end
    end
    return num
end


julia> t = testscope()
1

请参阅该答案,以获得一个很好的示例,说明如何对同一代码使用函数而不存在范围问题。

请记住,在函数中,您不会使用
全局
,因为函数中的范围规则与您预期的一样:

function testscope()
    num = 0
    for i = 1:5
        if i == 3
            num = num + 1
        end
    end
    return num
end


julia> t = testscope()
1
意外行为仅在REPL中出现。
更多关于这方面的信息

它很有效!谢谢我把全局变量放在num之前,但它不起作用。“看来朱莉娅的变量范围规则从0.7变为1.0”这句话是今年的轻描淡写@史蒂文:是的,你击中了我的头!如果是,OP不应该在对他的问题的评论中被引导到那里吗?好的评论。我自己也辩论过这个问题。然而,如果有人是一门语言的新手,有时对特定代码的准确答案可能比更一般的答案更容易理解。例如,你的链接有。这是我第一次真正在stackoverflow上做任何事情(除了几年前使用R语言)。谢谢PS:(我确实提供了一个链接,但没有提到重复。)哦,谢谢!这很有帮助,因为我确实在编写函数。在我完成整个函数之前,我必须通过逐行测试来保证这些中间步骤的工作,在这种情况下,我需要使用
global
,但是如果我在准备调用函数时不删除这些
global
,就会产生语法错误。