虽然没有全球
While without global
这段代码来自 JuliaBoxTutorials
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
while i <= length(myfriends)
friend = myfriends[i]
println("Hi $friend, it's great to see you!")
i += 1
end
当 运行 使用 Julia v1.0
时出现此错误
UndefVarError: i not defined
Stacktrace:
[1] top-level scope at ./In[12]:5 [inlined]
[2] top-level scope at ./none:0
但是当 i += 1
被替换为 global i += 1
时它起作用了。我想这在 v0.6 中仍然有效,一旦本周五新的 Julia 介绍发布,本教程将进行调整。
我只是想知道,是否可以在不声明全局变量的情况下进行 while 循环?
由于@Michael Paul 和@crstnbr 已在评论中回复,范围规则已更改 ()。 for
和 while
循环引入了一个新的作用域并且无法访问外部(全局)变量。您可以使用 global
关键字获得范围访问权限,但推荐的工作流程是将您的代码包装在函数中。
新设计的一个好处是,用户被迫避免这种直接影响函数性能的全局构造——当他们访问全局变量时,它们的类型不能稳定。
一个缺点是在 REPL 中进行实验并看到此类错误时会感到困惑。
在我看来,就可预测性而言,新行为更为清晰。然而,在整个 Julia 社区中,这是一场非常艰难且漫长的讨论 运行 ;)
目前正在讨论是否可以通过使用 let
-wraps 将 REPL 更改为像旧版本一样运行:https://github.com/JuliaLang/julia/issues/28789
这是手动完成的事情不切实际(比使用 global
关键字复杂得多),请参阅 Stefan Karpinski 的示例:https://github.com/JuliaLang/julia/issues/28789#issuecomment-414666648
无论如何,为了完整起见(虽然我不建议这样做)这里是一个使用global
:
的版本
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
N = length(myfriends)
while i <= N # you cannot even call a function here
# with a global, like length(myfriends)
global i, myfriends
friend = myfriends[i]
println("Hi $friend, it's great to see you!")
i += 1
end
但是请注意,这也是完全有效的:
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
greet(friend) = println("Hi $friend, it's great to see you!")
for friend in myfriends
greet(friend)
end
我发现这在 Julia v1.0 中有效:
let
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
while i <= length(myfriends) # this function here seems to work no problem
friend = myfriends[i]
println("Hi $friend, it's great to see you!")
i = i + 1 # gives syntax error when prefixed with global
end
end
事实上,如果我试图在 while 循环中使 i 成为全局 :),它会给我一个语法错误。
这段代码来自 JuliaBoxTutorials
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
while i <= length(myfriends)
friend = myfriends[i]
println("Hi $friend, it's great to see you!")
i += 1
end
当 运行 使用 Julia v1.0
时出现此错误UndefVarError: i not defined
Stacktrace:
[1] top-level scope at ./In[12]:5 [inlined]
[2] top-level scope at ./none:0
但是当 i += 1
被替换为 global i += 1
时它起作用了。我想这在 v0.6 中仍然有效,一旦本周五新的 Julia 介绍发布,本教程将进行调整。
我只是想知道,是否可以在不声明全局变量的情况下进行 while 循环?
由于@Michael Paul 和@crstnbr 已在评论中回复,范围规则已更改 (for
和 while
循环引入了一个新的作用域并且无法访问外部(全局)变量。您可以使用 global
关键字获得范围访问权限,但推荐的工作流程是将您的代码包装在函数中。
新设计的一个好处是,用户被迫避免这种直接影响函数性能的全局构造——当他们访问全局变量时,它们的类型不能稳定。
一个缺点是在 REPL 中进行实验并看到此类错误时会感到困惑。
在我看来,就可预测性而言,新行为更为清晰。然而,在整个 Julia 社区中,这是一场非常艰难且漫长的讨论 运行 ;)
目前正在讨论是否可以通过使用 let
-wraps 将 REPL 更改为像旧版本一样运行:https://github.com/JuliaLang/julia/issues/28789
这是手动完成的事情不切实际(比使用 global
关键字复杂得多),请参阅 Stefan Karpinski 的示例:https://github.com/JuliaLang/julia/issues/28789#issuecomment-414666648
无论如何,为了完整起见(虽然我不建议这样做)这里是一个使用global
:
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
N = length(myfriends)
while i <= N # you cannot even call a function here
# with a global, like length(myfriends)
global i, myfriends
friend = myfriends[i]
println("Hi $friend, it's great to see you!")
i += 1
end
但是请注意,这也是完全有效的:
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
greet(friend) = println("Hi $friend, it's great to see you!")
for friend in myfriends
greet(friend)
end
我发现这在 Julia v1.0 中有效:
let
myfriends = ["Ted", "Robyn", "Barney", "Lily", "Marshall"]
i = 1;
while i <= length(myfriends) # this function here seems to work no problem
friend = myfriends[i]
println("Hi $friend, it's great to see you!")
i = i + 1 # gives syntax error when prefixed with global
end
end
事实上,如果我试图在 while 循环中使 i 成为全局 :),它会给我一个语法错误。