变量作用域
变量的作用域是代码的一个区域,在这个区域中这个变量是可访问的。给变量划分作用域有助于解决变量命名冲突。因为很有可能两个函数同时有名为 x 的、本质不同的变量。
在 Julia 中主要有两种作用域:全局作用域与局部作用域,后者可以嵌套。在 Julia 中还存在引入“硬作用域”的构造和只引入“软作用域”的构造之间的区别,这影响到是否允许以相同的名称遮蔽全局变量。
julia> x = 1
1
julia> if true
local x = 0
end
0
julia> x
1作用域结构
引入作用域块的结构有:
| 结构 | 作用域类型 | 允许使用在 |
|---|---|---|
module 与 baremodule | 全局 | 全局 |
struct | 局部(软) | 全局 |
for 与 while 及 try | 局部(软) | 全局和局部 |
macro | 局部(硬) | 全局 |
函数,do 语句块,let 语句块,数组推导和生成器 | 局部(硬) | 全局和局部 |
此外,begin 和 if 块不会引进新的作用域块。
软作用域与硬作用域
具体的变量作用域规则较为复杂,可参阅变量作用域。大略如下:
硬作用域(函数、let、do、macro 等)中对变量的赋值总是局部的——若局部变量与外层同名,它们是完全独立的,外层变量不可见、也不受影响。
软作用域(for、while、try 等)中,若存在同名的外层全局变量,赋值行为依上下文而定:在交互式 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