Global variables Octave:清除全局变量后,我无法更改其值

Global variables Octave:清除全局变量后,我无法更改其值,global-variables,octave,variable-declaration,Global Variables,Octave,Variable Declaration,我已经定义了一个全局变量global x=-2。一旦创建,就不能重新分配全局变量,即,x=7不会更改x的-2值。因此,我清除了变量 >> clear x 我检查变量是否不再存在 >> exist("x") ans = 0 但是当我用一个新值再次创建全局变量时,例如,global x=7我得到了旧值中的全局变量 >> global x=7 >> x x = -2 为什么会这样?变量x是否未真正删除?我们需要使用选项-global有效删除全

我已经定义了一个全局变量
global x=-2
。一旦创建,就不能重新分配全局变量,即,
x=7
不会更改
x
-2
值。因此,我清除了变量

>> clear x
我检查变量是否不再存在

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

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

为什么会这样?变量
x
是否未真正删除?

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

示例:

>> global x=-2
>> clear -global x
>> exist("x")
ans = 0
>> global x=7
>> x
   x = 7
这一定是倍频程中的一个错误,因为只有
clear
命令似乎可以很好地清除全局变量:没有错误消息,“
exist
”检查输出预期的结果


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

您看到的是预期行为。看起来很奇怪,但是考虑下面的例子:

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 namespace/symbol表中,与
clear()
应该做的事情混淆在一起。您正在运行以下命令:

global x = 1;
clear x;
global x = 2;
x # you are surprised that x is 1 instead of 2
首先,请注意
clear()
实际上并不清除变量的值。它将从符号表中删除它们的名称。请注意
clear()
中的帮助文本:

使用“普通”变量,名称将不会出现在其他任何地方,您将有效地删除它们的值。但对于全局变量,情况并非如此。它们的值将保留在某个位置,以便下次定义名称为它们的全局变量时可以访问

当您再次尝试定义
x
时发生的情况是,该名称已存在于全局变量的符号表中。因此,您将其返回到当前符号表(就像函数内部发生的情况一样),而右侧(
=2
)永远不会得到计算


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

这不是错误。删除值和从符号表中删除名称之间存在混淆(
clear()
执行更高的操作)。虽然它们通常是相同的,但对于全局变量来说并非如此。
-- Command: clear [options] pattern ...
    Delete the names matching the given patterns from the symbol table.