列出所有全局变量

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)

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

  • @WReach,@ distves相关函数:`ValueQ`.它基本上是相同的:`variableQ [name_String]:= ToExpression [name,InputForm,ValueQ]` (6认同)
  • 完善; 谢谢!我可能还想要排除定义为`f =(#+ 1&)`的函数,这很容易添加一个检查(只是看看Head是否是函数,就像我在问题中所做的那样).但是你的解决方案就是你一般想要的.再次感谢. (2认同)