我正在编写一些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()
不过,我对这种解决方案并不满意,因为它需要预定义我要传递的每个变量。没有直接方法将变量传递到封闭范围吗?
答案 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]
对其进行迭代。