我阅读了有关 scope 的 Julia 文档,但在非交互式情况下我遇到了意外的行为(即从命令行运行脚本,而不是 REPL)。文档说:
软作用域:如果
还不是局部变量并且所有 包含赋值的作用域结构是软作用域(循环、 try/catch 块或 struct 块),行为取决于是否 全局变量x
定义为: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]
对我来说,这是出乎意料的,原因有两个:
x_int
,创建了一个局部变量,但没有打印任何歧义警告。x_arr[1]
,不是创建新的局部变量,而是修改了全局变量。这对我来说没有意义:(
设置
对于您的示例,您设置:
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
打印我们最近设置的值,它确实做到了。