在if语句中使用全局声明(Julia代码)

时间:2019-04-28 02:02:11

标签: scope julia

为什么如果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

1 个答案:

答案 0 :(得分:2)

您遇到的问题并不是真正的全局范围,也不必在此处声明全局范围。如果您想对全局变量进行写访问,则必须使用global关键字。

您的global关键字引入了新的全局绑定fibonacci_n_1fibonacci_n_2。将global关键字放在作用域中的位置无关紧要。您甚至可以在函数终止后访问fibonacci_n_1fibonacci_n_2的最后一个值:在全局范围内尝试f(5); println(fibonacci_n_1)

如果在函数中删除global声明,则fibonacci_n_1fibonacci_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部分。