Julia变量范围

问题描述 投票:2回答:2

我试图在while循环中使用一些全局变量(m,n,r),但是julia 1.0.0告诉我那些变量没有定义。该代码适用于julia 0.7.0,并带有一些警告。这是我正在使用的代码(是的,它编写得很好,我希望这不是问题。我为了简单起见删除了一个println语句):

m = readline()
n = readline()
m = parse(Int, m)
n = parse(Int, n)
r = m % n
while (r > 0)
        println( "m: $(m) n: $(n) r: $(r)" )
        r = m % n
        m = n
        n = r
end

这是julia 1.0.0的结果:

ERROR: LoadError: UndefVarError: m not defined
Stacktrace:
 [1] top-level scope at euclide.jl:11 [inlined]
 [2] top-level scope at ./none:0
 [3] include at ./boot.jl:317 [inlined]
 [4] include_relative(::Module, ::String) at ./loading.jl:1038
 [5] include(::Module, ::String) at ./sysimg.jl:29
 [6] exec_options(::Base.JLOptions) at ./client.jl:229
 [7] _start() at ./client.jl:421
in expression starting at euclide.jl:10

并与朱莉娅0.7.0:

┌ Warning: Deprecated syntax `implicit assignment to global variable `r``.
│ Use `global r` instead.
└ @ none:0
┌ Warning: Deprecated syntax `implicit assignment to global variable `m``.
│ Use `global m` instead.
└ @ none:0
┌ Warning: Deprecated syntax `implicit assignment to global variable `n``.
│ Use `global n` instead.
└ @ none:0

该代码适用于julia 0.7.0,但为什么它不适用于1.0.0版本?

scope migration julia
2个回答
3
投票

您必须声明在全局范围内定义的变量,并将循环局部作用域中的global分配给循环局部作用域,如下所示:

m = readline()
n = readline()
m = parse(Int, m)
n = parse(Int, n)
r = m % n
while (r > 0)
        println( "m: $(m) n: $(n) r: $(r)" )
        global r = m % n
        global m = n
        global n = r
end

你必须这样做的原因是while循环引入了一个新的局部范围,所以没有像global那样的m = n关键字赋值告诉Julia mwhile循环中的局部变量所以然后在println( "m: $(m) n: $(n) r: $(r)" )线中Julia决定m尚未定义。

另见https://docs.julialang.org/en/latest/manual/variables-and-scoping/Why does this assignment inside a loop fail in Julia 0.7 and 1.0?,以进一步解释朱莉娅的范围规则。


0
投票

您是否真的尝试过根据警告消息在代码模块顶部声明变量?

global r
global m
global n

欢迎来到Stackoverflow!

© www.soinside.com 2019 - 2024. All rights reserved.