在Julia中,是否可以将变量从本地范围传递到封闭的本地范围?

时间:2019-09-04 12:40:58

标签: scope julia

我正在编写一些Julia代码,并包装在一个函数中以提高性能。我需要将在循环中创建的变量传递给外部循环,但出于性能原因,想避免使用全局变量:

function f()
    for i=1:1
        for j=1:1
        a=2
        end
    println(a)
    end
end
f()

由于i循环的范围不知道变量 a ,因此会引发错误。首先在有问题的范围内定义 a

function f()
    for i=1:1
    a=0
        for j=1:1
        a=2
        end
    println(a)
    end
end
f()

不过,我对这种解决方案并不满意,因为它需要预定义我要传递的每个变量。没有直接方法将变量传递到封闭范围吗?

2 个答案:

答案 0 :(得分:2)

我认为没有直接方法global a = 2除外,您要避免)。

最接近您想要的是使用local

function f()
    for i=1:1
    local a
        for j=1:1
        a=2
        end
    println(a)
    end
end
f()

答案 1 :(得分:1)

@crstnbr是正确的,因为您所要求的功能未直接得到支持。嵌套作用域从其封闭作用域继承,而不是相反。这旨在防止嵌套范围内创建的变量对封闭范围的意外污染。

您的第二个示例函数看起来有些愚蠢,因为它是一个玩具示例,但是通常在迭代地对其进行更改之前,为变量提供初始值是有意义的。例如,考虑一个返回包含第一个n斐波那契数字(以0作为第零个斐波那契数字的数组)的函数:

# n is an integer greater than 0
function fib(n)
    if n==1
        return [0]
    end

    seq = [0, 1]
    while length(seq) < n
        nxt = seq[end-1] + seq[end]
        push!(seq, nxt)
    end

    seq
end
julia> fib(10)
10-element Array{Int64,1}:
  0
  1
  1
  2
  3
  5
  8
 13
 21
 34

在这里,您需要为seq提供一个初始值,然后才能使用seq[end-1] + seq[end]对其进行迭代。