For loop Julia中变量的作用域

For loop Julia中变量的作用域,for-loop,scope,julia,For Loop,Scope,Julia,当我运行下面的Julia代码时,出现了一个错误:UndevarError:globalValue未定义 我认为globalValue是一个全局变量,但它不是。因此,如果我在for循环中添加命令“globalglobalvalue”,我的代码就可以工作了。那么,有人能看一下吗?告诉我发生了什么事?提前谢谢 globalValue = 1.0; tempValue = 0.1; for ii = 1:10 # global globalValue; if I add this comma

当我运行下面的Julia代码时,出现了一个错误:
UndevarError:globalValue未定义

我认为globalValue是一个全局变量,但它不是。因此,如果我在for循环中添加命令“globalglobalvalue”,我的代码就可以工作了。那么,有人能看一下吗?告诉我发生了什么事?提前谢谢

globalValue = 1.0;
tempValue   = 0.1;
for ii = 1:10
    # global globalValue; if I add this command, my code will work
    tempValue = 5.0; ## I have a function to update "tempValue"
    if globalValue < tempValue
        globalValue = tempValue;
    end
end
globalValue=1.0;
tempValue=0.1;
对于ii=1:10
#全球价值;如果我添加此命令,我的代码将正常工作
tempValue=5.0;##我有一个更新“tempValue”的函数
如果全局值<临时值
全局值=临时值;
结束
结束

您似乎在Julia>=0.7上,范围规则已更改

长话短说,在局部范围内,例如for循环,全局变量只为读取而继承,不为写入而继承。有两种解决方法:

  • 在作业前放一个明确的
    global
    (你自己算出的)
  • 将所有内容包装在“全局-局部范围”中,如
    let。。。end
    block(
    globalValue
    不再是一个真正的全局变量)
在您的情况下,第二个选项如下

let
globalValue = 1.0;
tempValue   = 0.1;
for ii = 1:10
    tempValue = 5.0;## I have a function to update "tempValue"
    if globalValue < tempValue
        globalValue = tempValue;
    end
end
end
let
全局值=1.0;
tempValue=0.1;
对于ii=1:10
tempValue=5.0;##我有一个更新“tempValue”的函数
如果全局值<临时值
全局值=临时值;
结束
结束
结束
您可以在此处找到更多信息:

  • (特别是《朱莉娅》的作者之一斯特凡的文章
虽然我自己觉得这有点烦人,但有很好的理由说明为什么要进行更改。此外,on应该尽量避免更改全局变量。让我在这里引用手册(参见上面的链接):

许多人都考虑避免更改全局变量的值 成为编程的最佳实践。其中一个原因是 远程更改其他模块中全局变量的状态 应小心操作,因为这会导致程序的本地行为 很难解释。这就是为什么范围会阻止 局部作用域需要全局关键字来声明修改的意图 全局变量


感谢您关注这个问题和您的解释。是的,事实上,我正在使用Julia 1.0,因为变量的作用域规则已经改变。我不知道这一点。但是,似乎第二个选项目前不起作用。也许,我会详细查看参考资料,看看发生了什么。非常感谢您的帮助您的帮助!再次查看,现在它工作了。结果表明,全局变量的名称是
globalValue
,而您尝试在循环中更新
globalOptiValue
。您也可以在问题中更改此项。是的,的确,这是我的输入错误。现在它工作正常。非常感谢您的帮助!很高兴我能提供帮助。许多人将被重定向到这里,所以我想添加我的发现。你可以在一个全局定义的循环中写入一个变量,然后会创建一个单独的本地版本。如果你试图在同一个循环中读写一个全局变量,例如
I=I+1
,Julia只会抱怨。这是因为Julia不知道你想要的是全局版本还是本地版本由于这个原因,
println(globalValue)<代码> >代码> GualalValue= 2 可以在一个循环中单独地声明,但不在一起。当我为自己测试范围时,这些微妙之处令人迷惑。Hi @ NHVT,我看到您对StActObjt非常新。一般来说,如果答案已经解决了您的问题,请通过单击复选标记来考虑。更广泛的社区,你已经找到了解决方案,并给你的回答者和你自己带来了一些名声。当然,没有义务这样做。你也可以考虑接受你的其他问题的答案。嗨,CRSTNBR,谢谢你的信息。我一定会从现在起做!