为什么我声明变量是全局的,而它们在如果else if 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
发布于 2019-04-28 22:37:30
你的问题并不是关于全局范围,你不需要在这里声明任何全局的东西。如果您希望拥有对全局变量的写访问权限,则global
关键字是必需的。
global
关键字引入了新全局绑定fibonacci_n_1
和fibonacci_n_2
。将global
关键字放在作用域中的什么位置并不重要。甚至可以在函数终止后访问fibonacci_n_1
和fibonacci_n_2
的最后一个值:在全局范围内尝试f(5); println(fibonacci_n_1)
。
如果删除函数中的global
声明,则将在for
-loop的本地范围内定义fibonacci_n_1
和fibonacci_n_2
。因此,不会出现全局作用域访问问题。然而,您遇到的问题将是关于循环块中引入的变量的以下行为。
for
循环、while
循环和理解具有以下行为:在它们的主体范围中引入的任何新变量都是为每次循环迭代新分配的,就像循环体被let块包围一样
https://docs.julialang.org/en/v1/manual/variables-and-scoping/#For-Loops-and-Comprehensions-1
这意味着,如果在for
-loop中引入变量,则无法在上一次迭代中访问该变量的值或绑定。这与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部分。
https://stackoverflow.com/questions/55886418
复制相似问题