变量作用域

变量的作用域是代码的一个区域,在这个区域中这个变量是可访问的。给变量划分作用域有助于解决变量命名冲突。因为很有可能两个函数同时有名为 x 的、本质不同的变量。

在 Julia 中主要有两种作用域:全局作用域局部作用域,后者可以嵌套。在 Julia 中还存在引入“硬作用域”的构造和只引入“软作用域”的构造之间的区别,这影响到是否允许以相同的名称遮蔽全局变量。

julia> x = 1
1

julia> if true
           local x = 0
       end
0

julia> x
1

作用域结构

引入作用域块的结构有:

结构作用域类型允许使用在
modulebaremodule全局全局
struct局部(软)全局
forwhiletry局部(软)全局和局部
macro局部(硬)全局
函数,do 语句块,let 语句块,数组推导和生成器局部(硬)全局和局部

此外,beginif不会引进新的作用域块。

软作用域与硬作用域

具体的变量作用域规则较为复杂,可参阅变量作用域。大略如下:

硬作用域(函数、letdomacro 等)中对变量的赋值总是局部的——若局部变量与外层同名,它们是完全独立的,外层变量不可见、也不受影响。

软作用域forwhiletry 等)中,若存在同名的外层全局变量,赋值行为依上下文而定:在交互式 REPL 中会修改外层变量,而在脚本文件中则会创建局部变量(Julia 1.5+ 有所调整,具体见官方文档)。

若要消除歧义,可以用 local 显式声明局部变量,或用 global 显式修改全局变量:

julia> x = 0
0

julia> for i in 1:3
           global x += i   # 明确修改全局变量
       end

julia> x
6

julia> for i in 1:3
           local y = i * 2   # 明确创建局部变量
       end