Julia 在for循环中编辑值

Julia 在for循环中编辑值,julia,control-flow,Julia,Control Flow,在朱莉娅身上,我很惊讶以下几点不起作用: # Make a random value val = rand() # Edit it *inside an if statement in a for loop* for i in 1:10 println("current value of val = ", val) if true val = val * 2. end end 尝试运行此操作将导致: UndefVarError: val not def

在朱莉娅身上,我很惊讶以下几点不起作用:

# Make a random value
val = rand()
# Edit it *inside an if statement in a for loop*
for i in 1:10
    println("current value of val = ", val)
    if true
        val = val * 2. 
    end
end
尝试运行此操作将导致:

UndefVarError: val not defined
问题似乎是
if
语句。例如,它运行良好(除了不编辑
val
!):


为什么会这样

自Julia 1.x版以来,在更新循环中的全局变量时,需要使用全局关键字,因为它会创建一个新的局部范围:

见:


这就解释了为什么我的任何函数中都没有发生这种情况!谢谢。在创建随机标量时,可能会重复,您应该编写
val()
,而不是
val(1)[1]
,这是一个不必要且(10倍)缓慢的迂回。@DNF:我想您的意思是
rand()
,而不是
val()
。谢谢值得强调的是,通常只有在REPL中显式工作时(即在全局范围内)才会遇到这种行为。例如,我认为它永远不会出现在IJulia中,因为一切都在局部范围内。一个非常简单的解决方法是将所有代码放在一个
let中#代码在这里;结束
块,因为这会将所有内容移动到本地范围。
val = rand()
for i in 1:10
    println("current value of val = ", val)
#    if true
#        val = val * 2. 
#    end
end
julia> val = rand()
0.23420933324154358

julia> for i in 1:10
         println("Current value of val = $val")
         if true
           val = val * 2
         end
       end
ERROR: UndefVarError: val not defined
Stacktrace:
 [1] top-level scope at ./REPL[2]:2 [inlined]
 [2] top-level scope at ./none:0

julia> for i in 1:10
         println("Current value of val = $val")
         if true
           global val = val * 2
         end
       end
Current value of val = 0.23420933324154358
Current value of val = 0.46841866648308716
Current value of val = 0.9368373329661743
Current value of val = 1.8736746659323487
Current value of val = 3.7473493318646973
Current value of val = 7.494698663729395
Current value of val = 14.98939732745879
Current value of val = 29.97879465491758
Current value of val = 59.95758930983516
Current value of val = 119.91517861967031

julia>