Julia 1.1.1-绝对全局变量
我来自Fortran,在整个程序中使用全局数据向量。通常我声明一个模块:Julia 1.1.1-绝对全局变量,julia,Julia,我来自Fortran,在整个程序中使用全局数据向量。通常我声明一个模块: module xyz real, allocatable :: vector(:,:,:) ! a 3 dim vector, undefined end module 现在,在某个地方,比如子例程函数A,我为它分配内存并初始化为一些值: allocate(vector(10,20,30)) vector = ran() 现在,在程序子程序或函数B、C、D的任何其他单元中,如果我
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中,详细解释了从其他模块访问变量的规则 在您的情况下,关键问题如下: 仅当变量在模块中导出时,变量在使用后才可见 您可以访问其他模块中的变量 不允许从其他模块重新绑定变量 这意味着全局变量绑定创建操作是模块专用的 下面是一个简单的模块定义示例:
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:
但不是重新绑定x:
但是,您可以调用M模块中定义的函数来更改x的绑定,如下所示:
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的绑定。如果解释清楚,请告诉我;如果不是的话,我可以详细介绍一下。请注意有,所以你可能想探索一种不同的方法。博古米尔-谢谢你的帮助。阅读文档和用手操作是不同的。我发现我需要在定义模块中同时使用export和global,以便使变量普遍可用。
julia> x = 0
ERROR: cannot assign variable M.x from module Main
julia> x
1-element Array{Int64,1}:
10
julia> M.rebindx()
0-element Array{Int64,1}
julia> x
0-element Array{Int64,1}