【问题标题】:List all global variables列出所有全局变量
【发布时间】:2011-07-18 00:03:31
【问题描述】:

作为noted elsewhere,您可以列出所有用户定义的符号:

Names["Global`*"]

但我只想找到我的全局变量(我正在进行一些繁琐的调试),而不是我的函数定义。这样的事情很接近:

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

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

我可能会打败那个东西,但也许有更清洁、更直接的方法?

【问题讨论】:

    标签: wolfram-mathematica global-variables


    【解决方案1】:

    如果我们将任何具有自身值的符号视为“变量”,那么这将解决问题:

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

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

    编辑 1

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

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

    编辑 2

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

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

    此定义可以轻松扩展以检查其他类似函数的形式,例如插值函数、自动加载的符号等。

    【讨论】:

    • 完美;谢谢你!我可能还想排除像 f = (#+1&) 这样定义的函数,这很容易添加检查(只需查看 Head 是否是函数,就像我在问题中所做的那样)。但是您的解决方案是您通常想要的。再次感谢。
    • @WReach, @dreeves 相关函数:ValueQ。本质上是一样的:variableQ[name_String] := ToExpression[name, InputForm, ValueQ]
    • @Szabolcs 实际上,一般ValueQ 并不是那么无辜,因为在许多情况下它会泄漏评估 - 它会在测试值的过程中评估事物(我在这里讨论过 stackoverflow.com/questions/4599241/… 在更多详情)。不过,对于OwnValues,它似乎还可以,所以我的评论只与手头的案例无关。
    • @Leonid,我知道这一点,因为可以检查ValueQ 的实现(只需删除ReadProtected 属性)。是的,我应该提到ValueQ 适用于任何表达式,但只会保证它不会在符号的情况下评估该表达式(我们的情况)。 编辑:我刚刚注意到您在链接到的帖子中也介绍了ValueQ 的实现。
    【解决方案2】:

    人们可能会认为一个变量是一个Global` 符号,它不传递FunctionQ

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 2011-09-09
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多