我来自 Fortran,我在整个程序中使用全局数据向量。通常我声明一个模块:
module xyz
real, allocatable :: vector(:,:,:) ! a 3 dim vector, undefined
end module
现在,在某个地方,比如说子例程(函数)A,我正在为其分配内存并初始化为一些值:
allocate(vector(10,20,30))
vector = ran()
现在,在程序的任何其他单元(子例程或函数 B、C、D...)中,如果我正在使用该模块,即:
using xyz
上面声明的向量可用。
我无法在新的技术奇迹 Julia 1.1 中获得这种行为。范围规则真是让人头疼。
最佳答案
在 Julia 中,详细解释了从其他模块访问变量的规则here .
您的情况的关键问题如下:
- 只有在模块中
导出
时,变量在using
后才可见 - 您可以访问其他模块中的变量
- 不允许您从其他模块重新绑定(bind)变量
这意味着全局变量绑定(bind)创建操作是模块私有(private)的。
这是一个简单的模块定义示例:
module M
export x
x = Int[]
function rebindx()
global x = Int[]
end
end
现在假设您定义并稍后在 REPL 中使用它(它可以是任何其他模块)
julia> module M
export x
x = Int[]
function rebindx()
global x = Int[]
end
end
Main.M
julia> using .M
现在您可以访问x
:
julia> x
0-element Array{Int64,1}
julia> push!(x, 1)
1-element Array{Int64,1}:
1
julia> x
1-element Array{Int64,1}:
1
julia> x[1] = 10
10
julia> x
1-element Array{Int64,1}:
10
但不重新绑定(bind)x
:
julia> x = 0
ERROR: cannot assign variable M.x from module Main
但是,您可以调用 M
模块中定义的函数来更改 x
的绑定(bind),如下所示:
julia> x
1-element Array{Int64,1}:
10
julia> M.rebindx()
0-element Array{Int64,1}
julia> x
0-element Array{Int64,1}
这是可能的,因为 rebindx
是在模块 M
内定义的,因此它有权更改此模块中定义的变量 x
的绑定(bind).
关于Julia 1.1.1 - 绝对全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57291285/