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