试图了解Julia宏@isdefined

时间:2019-05-02 17:21:24

标签: julia

嗨,我试图了解@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

有人可以帮助解释每个块的问题吗?谢谢。

1 个答案:

答案 0 :(得分:3)

原因是afor循环范围内的局部变量。现在至关重要的部分是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才能获得相同的效果)