首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在最近的外部范围内捕获一个变量

问在最近的外部范围内捕获一个变量
EN

Stack Overflow用户
提问于 2013-12-19 01:05:43
回答 1查看 283关注 0票数 4

在Julia中,函数中的所有变量赋值在默认情况下都是本地的,但是您可以使用global关键字将其赋值给全局变量。如何将变量赋值给外部但非全局范围?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-19 04:17:54

答案取决于你到底想做什么。如果在外部本地作用域中已经存在(赋值或声明)一个变量,并且它不在内部本地作用域中隐藏,那么您只需将其赋值即可。您不能做的是将一个变量赋值给尚未从该作用域声明的外部本地作用域。您也不能将一个局部变量赋值给已被内部局部作用域中的另一个局部变量遮蔽的局部变量。我将试着给出每一个例子。

首先,这里有几件你可以做的事情。首先,您可以使用global关键字从本地范围创建一个全新的全局:

代码语言:javascript
复制
julia> function g1()
           global X = "hi"
       end
g1 (generic function with 1 method)

julia> g1();

julia> X
"hi"

接下来,您还可以重新分配已经分配的全局值:

代码语言:javascript
复制
julia> function g2()
           global X = "bye"
       end
g2 (generic function with 1 method)

julia> X
"hi"

julia> g2();

julia> X
"bye"

现在,让我们尝试类似于外部作用域是本地的第一件事情:

代码语言:javascript
复制
julia> function outer1(call::Bool)
           # no declaration of x
           function inner1()
               x = "inner" # local to inner1
           end
           call && inner1()
           @isdefined x # false
       end
outer1 (generic function with 1 method)

julia> outer1(false)
false

julia> outer1(true)
false

这不起作用,因为x对inner1是本地的,在outer1中是未定义的。inner1是否被调用并不重要--x从未在outer1中定义过。此外,在inner1中没有关键字可以使x出现在outer1中。

但是,您可以将其赋值给已经在外部作用域中创建的外部局部变量:

代码语言:javascript
复制
julia> function outer2(call::Bool)
           x = "outer"
           function inner2()
               x = "inner" # same x as outer2
           end
           call && inner2()
           return x
       end
outer2 (generic function with 1 method)

julia> outer2(false)
"outer"

julia> outer2(true)
"inner"

如果您不想在外部范围内给x一个初始值,该怎么办?您可以通过使用local声明它而不分配任何值来实现这一点:

代码语言:javascript
复制
julia> function outer3(call::Bool)
           local x # declare but don't assign
           function inner3()
               x = "inner" # same x as outer2
           end
           call && inner3()
           return @isdefined(x) ? x : nothing
       end
outer3 (generic function with 1 method)

julia> outer3(false)

julia> outer3(true)
"inner"

在这里,如果inner3未被调用,则x仍未定义,而如果被调用,则x具有"inner"值。

如果x被用作一个新的内部局部,并以相同的名称阴影外部本地,该怎么办?如果显式声明内部局部变量或函数参数(参数总是其函数的本地参数),则可能发生这种情况。示例:

代码语言:javascript
复制
julia> function outer3(call::Bool)
           x = "outer"
           function inner3()
               local x = "inner" # new local in inner3
           end
           call && inner3()
           return x
       end
outer3 (generic function with 1 method)

julia> outer3(false)
"outer"

julia> outer3(true)
"outer"
代码语言:javascript
复制
julia> function outer4(call::Bool)
           x = "outer"
           function inner4(x) # arg x is local to inner4
               x = "inner"
           end
           call && inner4(x)
           return x
       end
outer4 (generic function with 1 method)

julia> outer4(false)
"outer"

julia> outer4(true)
"outer"

在这两种情况下,向内部局部分配对外部绑定没有影响。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20671698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档