列出所有全局变量



如前所述,您可以使用以下命令列出所有用户定义的符号:

Names["Global`*"]

但是我想找到我的全局变量(我在一些毛茸茸的调试中间),而不是我的函数定义。如下所示:

Select[Names["Global`*"], Head@Symbol[#]=!=Symbol && Head@Symbol[#]=!=Function&]

但这遗漏了值为符号的变量(也许我有x = Pi)。

我也许可以打败它,但也许有一个更干净,更直接的方法?

如果我们将任何具有自己值的符号视为"变量",那么下面的代码就可以实现:

ClearAll[variableQ]
variableQ[name_String] := {} =!= ToExpression[name, InputForm, OwnValues]
Select[Names["Global`*"], variableQ]

请注意,这种技术在读取保护符号时将失败,并且会错误识别某些形式的自动加载函数。

编辑1

正如@Szabolcs指出的,如果使用ValueQ, variableQ的定义可以简化:

variableQ[name_String] := ToExpression[name, InputForm, ValueQ]

编辑2

正如@dreeves指出的那样,可能需要过滤掉那些值是函数的明显变量,例如f = (#+1)&:

variableQ[name_String] :=
  MatchQ[
    ToExpression[name, InputForm, OwnValues]
  , Except[{} | {_ :> (Function|CompiledFunction)[___]}]
  ]

这个定义可以很容易地扩展,以检查其他类似函数的形式,如插值函数,自动加载符号等。

可以认为一个变量是没有通过FunctionQGlobal`符号

相关内容

  • 没有找到相关文章

最新更新