Octave:清除后我无法更改全局变量的值

时间:2016-02-22 18:52:57

标签: global-variables octave variable-declaration

我定义了一个全局变量global x=-2。创建后,无法重新分配全局变量,即x=7不会更改-2的{​​{1}}值。出于这个原因,我清除了变量。

x

我检查变量不再存在。

>> clear x

但是当我用新值再次创建全局变量时,例如,>> exist("x") ans = 0 我得到旧值的全局变量。

global x=7

为什么会这样?变量>> global x=7 >> x x = -2 是否未真正删除?

2 个答案:

答案 0 :(得分:1)

您看到的是预期的行为。它看起来很奇怪,但请考虑以下示例:

global x = 5;

function say_x ()
  global x = 3;
  disp (x);
endfunction

say_x ();
x = 7;
say_x ();

返回:

5
7

请注意,您需要在函数中声明x来访问全局变量。另请注意,为其分配3的值不起作用。原因是persistent x = 3global x = 3等行仅在第一次进行评估。这意味着当您致电say_x()时,x已经有了一个值,因此它永远不会为其分配3的值(右侧甚至不会被评估)。

现在;关于你的实际问题,这是在main / base命名空间/符号表中发生的所有这一切,与clear()应该做的事情混在一起。你正在运行:

global x = 1;
clear x;
global x = 2;
x # you are surprised that x is 1 instead of 2

首先,请注意clear()实际上并不清除变量的值。它将从符号表中删除它们的名称。请注意clear()的帮助文字:

-- Command: clear [options] pattern ...
    Delete the names matching the given patterns from the symbol table.

"正常"变量,名称不会在其他任何地方,你将有效地删除它们的价值。但全球变量并非如此。它们的值将保留在某个位置,准备好在下次定义其名称的全局变量时可以访问。

当您尝试再次定义x时发生的事情是该名称已存在于全局变量的符号表中。所以你把它带回当前的符号表(就像函数内部发生的那样),右边的那边(= 2)永远不会被评估。

如您所知,要实际从全局符号表中删除名称,您需要使用clear -global(正如clear的帮助文本中所述)。

答案 1 :(得分:0)

我们需要使用选项 -global 来有效删除全局变量:x

示例:

clear -global x

这一定是Octave中的一个错误,因为单独>> global x=-2 >> clear -global x >> exist("x") ans = 0 >> global x=7 >> x x = 7 命令似乎可以正常清除全局变量:没有错误消息,并且" clear "检查输出预期。

(希望它有所帮助,我花了几分钟才找到解决方案;))