Julia 软范围内的意外行为

问题描述 投票:0回答:1

我阅读了有关 scope 的 Julia 文档,但在非交互式情况下我遇到了意外的行为(即从命令行运行脚本,而不是 REPL)。文档说:

软作用域:如果

x
还不是局部变量并且所有 包含赋值的作用域结构是软作用域(循环、 try/catch 块或 struct 块),行为取决于是否 全局变量
x
定义为:

  • 如果定义了 global
    x
    ,则该赋值被视为不明确:
    • 在非交互式上下文(文件、eval)中,会打印歧义警告并创建一个新的本地;

但是这是我从文件中运行的 MWE 代码:

x_int = 0
x_arr = [0]

for i in 1:1
    x_int = 1
    x_arr[1] = 1
end

println(x_int)
println(x_arr)

输出:

0
[1]

对我来说,这是出乎意料的,原因有两个:

  1. 对于
    x_int
    ,创建了一个局部变量,但没有打印任何歧义警告。
  2. 对于
    x_arr[1]
    ,不是创建新的局部变量,而是修改了全局变量。

这对我来说没有意义:(

scope julia
1个回答
0
投票

设置

对于您的示例,您设置:

x_int = 0
x_arr = [0]

for i in 1:1
    x_int = 1
    x_arr[1] = 1
end

println(x_int)
println(x_arr)

非交互运行

要以非交互方式运行此文件,请保存此文件并在 REPL 中使用

include()
运行文件。

julia> include("Drive:/Path/To/Code/FileNameHere.jl")
┌ Warning: Assignment to `x_int` in soft scope is ambiguous because a global variable by the same name exists: `x_int` will be treated as a new local. Disambiguate by using `local x_int` to suppress this warning or `global x_int` to assign to the existing global variable.
└ @ Drive:/Path/To/Code/FileNameHere.jl:5
0
[1]

如果需要,我们还可以直接运行该文件(在 REPL 之外)。在命令提示符(或您的系统使用的任何控制台)中,我们只需使用

julia NameOfFile

输入文件名即可
Drive:/Path/To/Your/PWD>julia Drive:/Path/To/Code/FileNameHere.jl

┌ Warning: Assignment to `x_int` in soft scope is ambiguous because a global variable by the same name exists: `x_int` will be treated as a new local. Disambiguate by using `local x_int` to suppress this warning or `global x_int` to assign to the existing global variable.
└ @ Drive:/Path/To/Code/FileNameHere.jl:5
0
[1]

行为解释

这些是等效的,并且都对范围界定不明确发出警告。正如预期的那样,我们期待

x_int
的全球“版本”,这就是我们收到的。您提到您的设备上未创建警告。如果是这样,那么您的最小示例不具有代表性,并且可能意味着您在原始项目中没有任何作用域变量歧义。

要理解为什么

x_arr[1]
返回您在软作用域中分配的值,以及为什么这是预期的,我们必须意识到您实际上并没有在第 6 行创建变量。在 Julia 中,
x_arr[index] = val
是简写对于
setindex!(x_arr,val,index)
。此操作直接更改变量 x_arr,而不是创建任何类型的新变量,因此范围在这种情况下不相关。因此,我们期望第 10 行的
println
打印我们最近设置的值,它确实做到了。

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