【问题标题】:Julia UndefVarError朱莉娅 UndefVarError
【发布时间】:2018-11-27 11:57:16
【问题描述】:
for i in 1:2
    if i == 2
        print(x)
    end
    if i == 1
        x = 0
    end
end

UndefVarError : x 未定义

为什么代码给出了那个错误,而不是在 julia 中打印 0?

而在python中下面的代码打印0?

for i in range(2):
    if i==1:
        print(x)
    if i==0:
        x=0

【问题讨论】:

  • 没有一种语言会允许您在声明变量之前 使用它。并且x 未声明。
  • 变量在声明之前没有被使用,这在python中有效
  • 你在第 3 行使用它。你在哪里声明它?不,这在 Python 中不起作用。请打开 Python 提示符并输入 print(x)。你会得到NameError: name 'x' is not defined
  • @Amy:这实际上在 Python 中工作,因为 x 在循环的第一次迭代中设置为 0,并且仅在第二次迭代时打印。
  • Julia 具有大多数代码块引入的本地范围。这样编译器就可以轻松地优化函数。在文档中查看:docs.julialang.org/en/v0.6.2/manual/variables-and-scoping/…

标签: python-3.x for-loop julia undefined-variable


【解决方案1】:

原因是因为在循环中,每次执行循环时,变量都会获得一个新的绑定,参见https://docs.julialang.org/en/latest/manual/variables-and-scoping/#For-Loops-and-Comprehensions-1

事实上,while 循环在 Julia 0.6.3 和 Julia 0.7 之间改变了这种行为(在 Julia 0.6.3 中没有创建新的绑定)。因此下面的代码:

function f()
    i=0
    while i < 2
        i+=1
        if i == 2
            print(x)
        end
        if i == 1
            x = 0
        end
    end
end

给出以下输出。

朱莉娅 0.6.3

julia> function f()
           i=0
           while i < 2
               i+=1
               if i == 2
                   print(x)
               end
               if i == 1
                   x = 0
               end
           end
       end
f (generic function with 1 method)

julia> f()
0

朱莉娅 0.7.0

julia> function f()
           i=0
           while i < 2
               i+=1
               if i == 2
                   print(x)
               end
               if i == 1
                   x = 0
               end
           end
       end
f (generic function with 1 method)

julia> f()
ERROR: UndefVarError: x not defined
Stacktrace:
 [1] f() at .\REPL[2]:6
 [2] top-level scope

For-loop 在每次迭代时已经在 J​​ulia 0.6.3 中创建了一个新绑定,因此它在 Julia 0.6.3 和 Julia 0.7.0 下都失败了。

编辑:我已将示例包装在一个函数中,但如果您在全局范围内执行 while 循环,您会得到相同的结果。

【讨论】:

    【解决方案2】:

    忽略我的评论并继续 Bogumil 的回答,因为这才是您的 x 变量在第二次迭代中消失的真正原因。

    如果您希望您的代码像在 Python 中一样工作,您可以将 global 关键字添加到 x 的分配中:

    for i in 1:2
        if i == 2
            print(x)
        end
        if i == 1
            global x = 0
        end
    end
    

    请注意,在大多数情况下不建议这样做,因为它会使您的代码性能受到影响。 Julia 喜欢编译器可以轻松优化掉的局部变量。

    【讨论】:

    • 原因不是局部作用域,而是for 循环中变量的重新绑定。请参阅我的答案中的解释。此外,if 块不会引入新的范围,如docs.julialang.org/en/latest/manual/variables-and-scoping/… 中所述。
    • 你是对的。对不起,我把事情搞混了。我更改了答案以反映这一点。
    猜你喜欢
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2014-12-31
    • 2017-01-15
    • 2016-02-18
    • 2021-11-04
    • 1970-01-01
    相关资源
    最近更新 更多