八度:清除全局变量后我无法更改它的值
Octave: I cannot change the value of a global variable after clearing it
我定义了一个全局变量global x=-2
。全局变量一旦创建就不能再赋值,即x=7
不会改变x
的-2
值。出于这个原因,我清除了变量。
>> clear x
我检查该变量是否不再存在。
>> exist("x")
ans = 0
但是当我用新值再次创建全局变量时,例如,global x=7
我得到旧值中的全局变量。
>> global x=7
>> x
x = -2
为什么会这样?变量x
不是真的删除了吗?
我们需要使用选项-global来有效删除全局变量:clear -global x
示例:
>> global x=-2
>> clear -global x
>> exist("x")
ans = 0
>> global x=7
>> x
x = 7
这一定是 Octave 中的错误,因为单独使用 clear
命令 似乎 可以很好地清除全局变量:没有错误消息,并且“exist
" 检查输出预期的结果。
(希望对您有所帮助,我花了几分钟才找到解决方案;))
您看到的是预期的行为。它看起来很奇怪,但请考虑以下示例:
global x = 5;
function say_x ()
global x = 3;
disp (x);
endfunction
say_x ();
x = 7;
say_x ();
哪个returns:
5
7
请注意,您需要在函数中声明 x
才能访问全局变量。另请注意,将 3
的值分配给它不起作用。原因是 persistent x = 3
或 global x = 3
等行仅在第一次评估。这意味着当您调用 say_x()
时,x
已经有一个值,因此它永远不会分配给它 3
的值(右侧甚至不会被评估)。
现在;关于您的实际问题,即 main/base namespace/symbol table 中发生的所有这一切,与 clear()
应该做的事情混在一起。你是运行这个:
global x = 1;
clear x;
global x = 2;
x # you are surprised that x is 1 instead of 2
首先,请注意 clear()
实际上并没有清除变量的值。它将从符号 table 中删除他们的名字。请注意来自 clear()
:
的帮助文本
-- Command: clear [options] pattern ...
Delete the names matching the given patterns from the symbol table.
使用 "normal" 变量,名称不会出现在其他任何地方,您将有效地删除它们的值。但全局变量并非如此。它们的值将保留在某个地方,准备好在下次定义具有它们名称的全局变量时可以访问。
当您尝试再次定义 x
时发生的情况是,该名称已经存在于全局变量的符号 table 中。所以你把它带回当前符号 table (就像函数内部发生的一样)并且右侧 (= 2
) 永远不会被评估。
如您所见,要真正从全局符号 table 中删除名称,您需要使用 clear -global
(如 clear
的帮助文本中所述)。
我定义了一个全局变量global x=-2
。全局变量一旦创建就不能再赋值,即x=7
不会改变x
的-2
值。出于这个原因,我清除了变量。
>> clear x
我检查该变量是否不再存在。
>> exist("x")
ans = 0
但是当我用新值再次创建全局变量时,例如,global x=7
我得到旧值中的全局变量。
>> global x=7
>> x
x = -2
为什么会这样?变量x
不是真的删除了吗?
我们需要使用选项-global来有效删除全局变量:clear -global x
示例:
>> global x=-2
>> clear -global x
>> exist("x")
ans = 0
>> global x=7
>> x
x = 7
这一定是 Octave 中的错误,因为单独使用 clear
命令 似乎 可以很好地清除全局变量:没有错误消息,并且“exist
" 检查输出预期的结果。
(希望对您有所帮助,我花了几分钟才找到解决方案;))
您看到的是预期的行为。它看起来很奇怪,但请考虑以下示例:
global x = 5;
function say_x ()
global x = 3;
disp (x);
endfunction
say_x ();
x = 7;
say_x ();
哪个returns:
5
7
请注意,您需要在函数中声明 x
才能访问全局变量。另请注意,将 3
的值分配给它不起作用。原因是 persistent x = 3
或 global x = 3
等行仅在第一次评估。这意味着当您调用 say_x()
时,x
已经有一个值,因此它永远不会分配给它 3
的值(右侧甚至不会被评估)。
现在;关于您的实际问题,即 main/base namespace/symbol table 中发生的所有这一切,与 clear()
应该做的事情混在一起。你是运行这个:
global x = 1;
clear x;
global x = 2;
x # you are surprised that x is 1 instead of 2
首先,请注意 clear()
实际上并没有清除变量的值。它将从符号 table 中删除他们的名字。请注意来自 clear()
:
-- Command: clear [options] pattern ...
Delete the names matching the given patterns from the symbol table.
使用 "normal" 变量,名称不会出现在其他任何地方,您将有效地删除它们的值。但全局变量并非如此。它们的值将保留在某个地方,准备好在下次定义具有它们名称的全局变量时可以访问。
当您尝试再次定义 x
时发生的情况是,该名称已经存在于全局变量的符号 table 中。所以你把它带回当前符号 table (就像函数内部发生的一样)并且右侧 (= 2
) 永远不会被评估。
如您所见,要真正从全局符号 table 中删除名称,您需要使用 clear -global
(如 clear
的帮助文本中所述)。