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



我定义了一个全局变量global x=-2 。全局变量一旦创建,就不能重新赋值,即x=7不会改变x-2值。出于这个原因,我清除了变量。

>> clear x

我检查变量是否不再存在。

>> exist("x")
ans = 0

但是,例如,当我再次使用新值创建全局变量时,global x=7我得到了旧值中的全局变量。

>> global x=7
>> x
   x = -2

为什么会这样?变量x没有真正删除吗?

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

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的值(右手边甚至永远不会被计算)。

现在; 继续你的实际问题,所有这些都发生在主/基本命名空间/符号表中,与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 的帮助文本中)。

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

例:

>> global x=-2
>> clear -global x
>> exist("x")
ans = 0
>> global x=7
>> x
   x = 7

这一定是Octave中的一个错误,因为仅clear命令似乎就可以很好地清除全局变量:没有错误消息,并且" exist "检查输出预期的。

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

相关内容

  • 没有找到相关文章

最新更新