Julia 1.1.1 - 绝对全局变量

标签 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...)中,如果我正在使用该模块,即:

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/

相关文章:

optimization - Julia - 了解 JuMP Gurobi 输出

julia - 如何在 Julia 中进行两个变量数值积分?

dataframe - 使用列选择器 (Cols) 转换数据框列失败

serialization - Julia:在运行时生成代码并将其存储以供将来评估/执行

julia 角度函数返回相同角度的不同值

plot - 包装未定义

matlab - 替换 Julia 子矩阵中的值

julia - 组合不等长的向量

module - 了解如何扩展 Julia 模块

Julia :与数据类型/数据帧错误混淆