gpt4 book ai didi

julia - 带有嵌套在 for 循环中的 if block 的 Julia 变量的范围

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

for i=1:5
if(i==1)
z = i
end
println("i = $i, z = $z")
end

i = 1, z = 1
ERROR: UndefVarError: z not defined
Stacktrace:
[1] top-level scope at ./REPL[6]:5 [inlined]
[2] top-level scope at ./none:0

上述脚本的行为令我感到困惑。有人能帮我理解为什么在 i=1 时打印工作但在 i=2 时失败。

最佳答案

@Wookies-Will-Code 的答案是正确的,原因如下。

正如 Julia 手册解释的那样 here :

for loops, while loops, and Comprehensions have the following behavior: any new variables introduced in their body scopes are freshly allocated for each loop iteration



这意味着在每次迭代结束时 z被遗忘了。

为了确定 z的值在迭代中持续(以及在 for 循环结束之后)定义 z在循环之前。例如像这样:
function mytest()
local z
for i=1:5
if i==1
z = i
end
println("i = $i, z = $z")
end
end

现在你有:
julia> mytest()
i = 1, z = 1
i = 2, z = 1
i = 3, z = 1
i = 4, z = 1
i = 5, z = 1

请注意,情况在全局范围内有所不同。即使 z是全局定义的,默认情况下不重用:
julia> z = 100
100

julia> for i=1:5
if i==1
z = i
end
println("i = $i, z = $z")
end
i = 1, z = 1
ERROR: UndefVarError: z not defined
Stacktrace:
[1] top-level scope at .\REPL[7]:5 [inlined]
[2] top-level scope at .\none:0

原因是Julia对待 z作为 for 循环的局部,因为 z被分配到循环内部。这是一个编译时特性检查,所以即使 if条件总是失败你会得到这个错误:
julia> z = 100
100

julia> for i=1:5
if false
z = i
end
println("i = $i, z = $z")
end
ERROR: UndefVarError: z not defined
Stacktrace:
[1] top-level scope at .\REPL[18]:5 [inlined]
[2] top-level scope at .\none:0

您必须分配给 z使用 global关键字使其工作:
julia> z = 100
100

julia> for i=1:5
if i==1
global z = i
end
println("i = $i, z = $z")
end
i = 1, z = 1
i = 2, z = 1
i = 3, z = 1
i = 4, z = 1
i = 5, z = 1

关于julia - 带有嵌套在 for 循环中的 if block 的 Julia 变量的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54930723/

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