gpt4 book ai didi

julia - 为什么 Julia 变量不存在于 for 循环的范围内?

转载 作者:行者123 更新时间:2023-12-04 08:15:08 25 4
gpt4 key购买 nike

我正在使用 Julia 进行一些基本的集成估计,并使用以下代码获得 UndefVarError:

using ExcelReaders
er = ExcelReaders

etInt = 0

waveLen = er.readxl("AM0AM1_5.xls", "Spectra!A3:A2004")
eT = er.readxl("AM0AM1_5.xls", "Spectra!B3:B2004")
gTilt = er.readxl("AM0AM1_5.xls", "Spectra!C3:C2004")
dirSol = er.readxl("AM0AM1_5.xls", "Spectra!D3:D2004")

function trArea(r::Real, l::Real, v::Array, x::Int)
return ((1/2) * (v[x] + v[x+1]) * (r-l))
end

for x in 1:length(waveLen)-1
etInt += trArea(waveLen[x], waveLen[x+1], eT, x)
end

错误指向第 16 行。据我所知,这意味着在 for 循环范围内未定义 etInt。为什么 Julia 会出现这种情况?

最佳答案

To my understanding, this means that etInt is undefined within the scope of the for-loop.



全局变量确实存在于所有局部作用域中(例如 for 循环)。但是,从 Julia 1.0 版开始,它们在这些本地范围内是只读的。对全局变量的写访问必须明确。

举一个简单的例子,而
julia> x = 1       
1

julia> for i in 1:3
@show x # only reading a global variable
end
x = 1
x = 1
x = 1

工作得很好,
julia> for i in 1:3
x += 1 # writing to a global variable
@show x
end
ERROR: UndefVarError: x not defined
Stacktrace:
[1] top-level scope at .\REPL[3]:2 [inlined]
[2] top-level scope at .\none:0

不起作用。这可以通过放置一个明确的 global 来解决。注解:
julia> for i in 1:3
global x += 1
@show x
end
x = 2
x = 3
x = 4

有关更多信息,请参阅 scoping section in the Julia documentation .

请注意,人们对此提示很多,并且正在 github 上积极讨论。和话语(例如 herehere )。

请注意,这些范围规则的影响,例如您收到的可能不直观的错误消息,只有在您在全局范围(如 REPL)中操作时才会真正影响您。如果你把所有东西都放在一个函数中——任何本地范围——你会得到预期的行为:
julia> function f()
x = 1
for i in 1:3
x += 1 # no global necessary
@show x
end
nothing
end
f (generic function with 1 method)

julia> f()
x = 2
x = 3
x = 4

无论如何,这是您应该做的才能真正获得快速运行时间,因为全局变量几乎总是对性能不利(请参阅 Performance Tips )。

另请注意,在使用 IJulia 的 Jupyter 笔记本中,一切都将按预期工作。原因是人们也在想出依赖于上下文的解决方案,在这种情况下 SoftGlobalScope.jl . REPL 正在/正在考虑类似的事情。这些是人们交互工作的主要场所。

因此,总而言之,您可以只学习范围规则(这非常简单),或者像 jupyter 笔记本一样等待一些讨论过的“修复”落地。

关于julia - 为什么 Julia 变量不存在于 for 循环的范围内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54384593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com