我定义了一个全局变量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 = 3
或 global 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
"检查输出预期的。
(希望有帮助,我花了几分钟才找到解决方案;))