如前所述,您可以使用以下命令列出所有用户定义的符号:
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)[___]}]
]
这个定义可以很容易地扩展,以检查其他类似函数的形式,如插值函数,自动加载符号等。
可以认为一个变量是没有通过FunctionQ
的Global`
符号