首页 > 解决方案 > 在 if 语句中使用全局声明(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

标签: scopejulia

解决方案


您遇到的问题实际上与全局范围无关,您不必在此处声明任何全局内容。global如果您想对全局变量进行写访问,则关键字是必需的。

您的global关键字引入了新的全局绑定fibonacci_n_1fibonacci_n_2. global将关键字放在范围内的哪个位置并不重要。您甚至可以访问函数终止后的最后一个值:fibonacci_n_1在全局范围内尝试。fibonacci_n_2f(5); println(fibonacci_n_1)

如果您删除global函数中的声明,fibonacci_n_1并且fibonacci_n_2将在您的for-loop 的本地范围内定义。因此,不会存在全局范围访问问题。但是,您遇到的问题将与循环块中引入的变量的以下行为有关。

forloops、whileloops 和 Comprehensions 具有以下行为:在其主体范围内引入的任何新变量都是为每次循环迭代新分配的,就好像循环体被一个 let 块包围

https://docs.julialang.org/en/v1/manual/variables-and-scoping/#For-Loops-and-Comprehensions-1

这意味着如果您在-loop 中引入该变量,您将无法在上一次迭代中访问该变量的值或绑定。Python 或 MATLAB 循环中引入的变量的行为不同。for

相反,您可以在 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 文档的变量范围部分。


推荐阅读