八度:清除全局变量后我无法更改它的值

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 = 3global 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 的帮助文本中所述)。