作为noted elsewhere,您可以列出所有用户定义的符号:
Names["Global`*"]
但是我想找到我的全局变量(我正在进行一些毛茸茸的调试),而不是我的函数定义。这样的事情很接近:
Select[Names["Global`*"], Head@Symbol[#]=!=Symbol && Head@Symbol[#]=!=Function&]
但是错过了价值是符号的变量(也许我有x = Pi
)。
我可能会把这个东西击败,但也许有更清洁,更直接的方式?
答案 0 :(得分:15)
如果我们将任何具有自己值的符号视为“变量”,那么这将起到作用:
ClearAll[variableQ]
variableQ[name_String] := {} =!= ToExpression[name, InputForm, OwnValues]
Select[Names["Global`*"], variableQ]
请注意,此技术将在读保护符号上失败,并且会错误识别某些形式的自动加载函数。
修改1
正如@Szabolcs指出的那样,如果使用variableQ
,可以简化ValueQ
的定义:
variableQ[name_String] := ToExpression[name, InputForm, ValueQ]
修改2
正如@dreeves指出的那样,可能需要过滤出值为函数的表观变量,例如: f = (#+1)&
:
variableQ[name_String] :=
MatchQ[
ToExpression[name, InputForm, OwnValues]
, Except[{} | {_ :> (Function|CompiledFunction)[___]}]
]
这个定义可以很容易地扩展,以检查其他类似函数的形式,如插值函数,自动加载的符号等。
答案 1 :(得分:1)
有人可能会认为某个变量是Global`
符号,但未通过FunctionQ
。