Julia 在定义变量时抛出未定义错误

如何解决Julia 在定义变量时抛出未定义错误

我有一个简单的 while 循环,它使用 i = 1 作为索引。

global i = 1 
    
    n = rows
    while i <= n
        if prod(isa.(collect((y)[i,:]),Number))==0
            delete!(y,i)
            x_axis = x_axis[1:end .!= i]
            n -= 1
        end
        i += 1
    end

但我收到此错误

undefvarerror: i not defined

top-level scope@Local: 23

我什至按照有关 SO 的一些类似问题的建议将我的 i 设为全局,但错误仍然存​​在。我在 Pluto.jl 上运行它,所以可能是环境问题。

解决方法

首先,请注意,如果您使用 Julia v1.5+,那么您不需要需要将 i 设为全局(以下示例使用当前稳定版本 v1.5.4):

julia> i = 1
1

julia> while i < 5
           println(i)
           i += 1     # <----- this works in Julia v1.5+
       end
1
2
3
4

但是,您似乎使用的是较旧的 Julia v1.4,在这种情况下,我认为 Logan Kilpatrick 给了您答案:您需要从 insidei 设为全局while 循环的范围。正如 Logan 提到的,尝试在增加 global 的地方添加 i,就像 while 函数文档中的这个例子一样:

julia> i = 1 ;

julia> while i < 5
           println(i)
           global i += 1     # <------------ Try this!
       end
1
2
3
4

另请注意,如果您的 while 循环在函数内,则您不需要指定它是全局的,如

julia> function foo(istart)
           i = istart
           while i < 5
               println(i)
               i += 1     # <-- 'global' not needed inside a function!
           end
       end
foo (generic function with 1 method)

julia> foo(1)
1
2
3
4
,

您遇到了“模棱两可的软作用域案例”。

简而言之:在(软)局部范围内分配局部变量取决于代码是否在“REPL上下文”中 与否。

对于“REPL 上下文”,我指的是 REPL 以及在这种情况下作为 REPL 行为的所有环境,例如 朱庇特:

julia> i = 0
julia> while i < 3
         i += 1
         @info i
       end
[ Info: 1
[ Info: 2
[ Info: 3

取而代之的是来自非交互式上下文(如文件、eval 和 Pluto)的代码的行为如下:

julia> code = """
       i = 0
       while i < 3
         i += 1
         @info i
       end
       """

julia> include_string(Main,code)
┌ Warning: Assignment to `i` in soft scope is ambiguous because a global variable by the same name exists: `i` will be treated as a new local. Disambiguate by using `local i` to suppress this warning or `global i` to assign to the existing global variable.
└ @ string:3
ERROR: LoadError: UndefVarError: i not defined

所有这些都旨在确保 REPL 使用的便利性,并避免大规模使用 julia 带来的不必要的副作用。

完整详情here

要解决该问题,您可以按照建议使用 global 或将您的代码包含在函数中。

,

Pluto 将单元格隐式包装到函数中,请参阅 https://github.com/fonsp/Pluto.jl/pull/720,因此不需要 global 注释或显式包装到函数中。

将以下内容放入 Pluto 单元格中对我有用:

begin
    i = 1
    n = 100
    while i<=n
        if i % 2 == 0
            n -= 1
        end
        i += 1
    end
end

当在单元格内使用宏时,隐式函数包装被禁用(这会阻止 Pluto 收集反应性信息),因此由于 Julia 范围规则,以下在 Pluto 中不起作用:

begin
    i = 1
    n = 100
    while i<=n
        if i % 2 == 0
            n -= 1
        end
        @show i += 1
    end
end

抛出:

UndefVarError: i not defined

top-level scope@Local: 5[inlined]
top-level scope@none:0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?