在Julia中,函数中的所有变量赋值在默认情况下都是本地的,但是您可以使用global关键字将其赋值给全局变量。如何将变量赋值给外部但非全局范围?
发布于 2013-12-19 04:17:54
答案取决于你到底想做什么。如果在外部本地作用域中已经存在(赋值或声明)一个变量,并且它不在内部本地作用域中隐藏,那么您只需将其赋值即可。您不能做的是将一个变量赋值给尚未从该作用域声明的外部本地作用域。您也不能将一个局部变量赋值给已被内部局部作用域中的另一个局部变量遮蔽的局部变量。我将试着给出每一个例子。
首先,这里有几件你可以做的事情。首先,您可以使用global关键字从本地范围创建一个全新的全局:
julia> function g1()
global X = "hi"
end
g1 (generic function with 1 method)
julia> g1();
julia> X
"hi"接下来,您还可以重新分配已经分配的全局值:
julia> function g2()
global X = "bye"
end
g2 (generic function with 1 method)
julia> X
"hi"
julia> g2();
julia> X
"bye"现在,让我们尝试类似于外部作用域是本地的第一件事情:
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中。
但是,您可以将其赋值给已经在外部作用域中创建的外部局部变量:
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声明它而不分配任何值来实现这一点:
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被用作一个新的内部局部,并以相同的名称阴影外部本地,该怎么办?如果显式声明内部局部变量或函数参数(参数总是其函数的本地参数),则可能发生这种情况。示例:
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"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"在这两种情况下,向内部局部分配对外部绑定没有影响。
https://stackoverflow.com/questions/20671698
复制相似问题