朱莉娅:变量未定义。

15

变量作用域行为似乎相当奇怪。 代码块

tp = 1
function test2()
    println(tp)
end

在不影响使用的情况下,可以完美运行。

function test()
    if tp==0
       tp=tp-1
    end
end

出现“tp未定义”的异常。问题出在哪里?

1个回答

21

由于变量隐式定义为局部变量或全局变量,以及函数内后面的定义会影响其整个作用域,因此这很棘手。

在第一种情况下,tp 默认为全局变量,并且按预期工作。但是,在第二种情况下,您对tp进行了赋值。正如变量作用域部分的说明所示:

"仅当x在当前代码行之前或之后未被任何封闭作用域声明为全局变量或局部变量时,赋值x=y才会引入新的局部变量x。"

因此,通过对tp进行赋值,您隐式地声明它为局部变量!现在它将掩盖您全局变量的定义......除非您首先尝试访问它。解决方法很简单:如果要对它们进行赋值,请明确声明任何要使用的变量为全局变量:

   function test()
       global tp
       if tp==0
          tp=tp-1
       end
   end

这里的行为非常微妙,但非常一致。在我最终理解它是如何工作之前,我知道我不得不反复阅读手册中的那部分内容。如果您能想出更好的描述方式,请说出来!


今天在同事的代码中出现了类似的情况 - 这可能会变得非常棘手 - 我认为至少在这种情况下必须更改错误消息(例如“变量在定义之前使用”),我无法看到文档中有明确说明(任何地方使用的局部变量覆盖先前读取的全局变量)。 - oyd11

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