为什么如果elseif else块相同,我为什么要声明全局变量?我想念什么?
function f(N)
for n in 0:N
if n == 0
fibonacci_n = 0
fibonacci_n_1 = fibonacci_n
elseif n == 1
fibonacci_n = 1
fibonacci_n_1 = fibonacci_n
fibonacci_n_2 = fibonacci_n_1
else
global fibonacci_n_1, fibonacci_n_2
fibonacci_n = fibonacci_n_1 + fibonacci_n_2
fibonacci_n_1 = fibonacci_n
fibonacci_n_2 = fibonacci_n_1
end
@printf "%5i %10i\n" n fibonacci_n
end
end
答案 0 :(得分:2)
您遇到的问题并不是真正的全局范围,也不必在此处声明全局范围。如果您想对全局变量进行写访问,则必须使用global
关键字。
您的global
关键字引入了新的全局绑定fibonacci_n_1
和fibonacci_n_2
。将global
关键字放在作用域中的位置无关紧要。您甚至可以在函数终止后访问fibonacci_n_1
和fibonacci_n_2
的最后一个值:在全局范围内尝试f(5); println(fibonacci_n_1)
。
如果在函数中删除global
声明,则fibonacci_n_1
和fibonacci_n_2
将在for
循环的本地范围内定义。因此,将不会出现全局范围访问问题。但是,您遇到的问题将与循环块中引入的变量的以下行为有关。
for
循环,while
循环和理解具有以下行为:在其主体作用域中引入的所有新变量都为每次循环迭代新鲜分配,就像循环主体被一个let块包围https://docs.julialang.org/en/v1/manual/variables-and-scoping/#For-Loops-and-Comprehensions-1
这意味着,如果您在for
循环中引入该变量,则无法访问该变量的值或在上一次迭代中绑定 。这与Python或MATLAB循环中引入的变量的行为不相似。
相反,您可以在for循环之外但在函数内部定义此类变量。
function f(N)
fibonacci_n, fibonacci_n_1, fibonacci_n_2 = 0, 0, 0
for n in 0:N
if n == 0
fibonacci_n = 0
fibonacci_n_1 = fibonacci_n
elseif n == 1
fibonacci_n = 1
fibonacci_n_2 = fibonacci_n_1
fibonacci_n_1 = fibonacci_n
else
fibonacci_n = fibonacci_n_1 + fibonacci_n_2
fibonacci_n_2 = fibonacci_n_1
fibonacci_n_1 = fibonacci_n
end
@printf "%5i %10i\n" n fibonacci_n
end
end
有关Julia中变量范围的更多相关讨论,请参阅Julia文档的Scope of Variables部分。