朱莉娅:变量未定义

war*_*aga 11 variables global-variables julia

变量范围行为似乎很奇怪.代码块

tp = 1
function test2()
    println(tp)
end
Run Code Online (Sandbox Code Playgroud)

非常适合

function test()
    if tp==0
       tp=tp-1
    end
end
Run Code Online (Sandbox Code Playgroud)

给出了"tp未定义"的异常.怎么了?

Mat*_* B. 14

由于变量被隐式定义为局部或全局的方式,以及函数后面的定义可以影响它们在整个函数中的作用域这一事实,这很棘手.

在第一种情况下,tp默认为全局变量,它按预期工作.但是,在第二种情况下,您分配tp.这一点,如手册变量范围中所述:

" 只有在当前代码行之前或之后的任何封闭范围都没有声明为全局或引入x = y 本地变量时,赋值x才会引入新的局部变量."x

因此,通过赋值tp,您已隐式将其声明为局部变量!现在它将影响全局的定义...除了您首先尝试访问它.解决方案很简单:如果要分配给它们,请显式声明任何变量为全局变量:

   function test()
       global tp
       if tp==0
          tp=tp-1
       end
   end
Run Code Online (Sandbox Code Playgroud)

这里的行为非常细微,但它非常一致.我知道在我终于明白这是如何工作之前,我花了一些时间阅读了手册的那一部分.如果您能想出更好的描述方式,请说些什么!