嗨,我试图了解@isdefined宏的工作原理。
我期望Chunk 1打印出1 2 3 4,但是它什么也没打印。
也相关,我期望块2打印出2 3 4 5,但是它抛出一个错误:“未定义”。
# Chunk 1
for i = 1:5
if @isdefined a
print(a)
end
a = i
end
# Chunk 2
for i = 1:5
if i > 1
print(a)
end
a = i
end
有人可以帮助解释每个块的问题吗?谢谢。
答案 0 :(得分:3)
原因是a
是for
循环范围内的局部变量。现在至关重要的部分是for
循环遵循以下定义的here规则:
for
循环,while
循环和理解具有以下行为:在其主体作用域中引入的任何新变量都为每次循环迭代新鲜分配
这意味着在循环结束时分配给a
不会继续进行下一次迭代,因为当新迭代开始时,旧值a
由于a
是新分配的,因此将被丢弃。只有在a=i
分配后才能定义。
因此,您有以下行为:
julia> for i = 1:5
if @isdefined a
println("before: ", a)
end
a = i
if @isdefined a
println("after: ", a)
end
end
after: 1
after: 2
after: 3
after: 4
after: 5
但是,如果a
是在外部范围中定义的,则其值不是for
局部循环,并且在两次迭代之间保留,因此例如:
julia> let a
for i = 1:5
if @isdefined a
println("before: ", a)
end
a = i
if @isdefined a
println("after: ", a)
end
end
end
after: 1
before: 1
after: 2
before: 2
after: 3
before: 3
after: 4
before: 4
after: 5
和
julia> let a
for i = 1:5
if i > 1
println(a)
end
a = i
end
end
1
2
3
4
我使用了let
块,但是它可以是除全局范围之外的任何外部范围(在这种情况下,您必须将a = i
更改为global a = i
才能获得相同的效果)