我定义了一个全局变量global x=-2
。创建后,无法重新分配全局变量,即x=7
不会更改-2
的{{1}}值。出于这个原因,我清除了变量。
x
我检查变量不再存在。
>> clear x
但是当我用新值再次创建全局变量时,例如,>> exist("x")
ans = 0
我得到旧值的全局变量。
global x=7
为什么会这样?变量>> global x=7
>> x
x = -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 = 3
或global 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
"检查输出预期。
(希望它有所帮助,我花了几分钟才找到解决方案;))