Список всех глобальных переменных

As отмечалось, вы можете перечислить все пользовательские символы с помощью этого:

Names["Global`*"]

но я хотел бы найти только мои глобальные переменные (я нахожусь в середине какой-то волосатой отладки), а не мои определения функций. Что-то вроде этого близко:

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

но это пропускает переменные, значение которых является символом (возможно, у меня есть x = Pi).

Я, вероятно, мог бы избить эту вещь в подчинение, но, возможно, есть более чистый, более прямой способ?

2 ответов


если мы рассмотрим любой символ с собственным значением как "переменную", то это сделает трюк:

ClearAll[variableQ]
variableQ[name_String] := {} =!= ToExpression[name, InputForm, OwnValues]

Select[Names["Global`*"], variableQ]

обратите внимание, что этот метод не будет работать на защищенных от чтения символах и будет неправильно идентифицировать некоторые формы автоматически загружаемых функций.

изменить 1

как указывает @Szabolcs, определение variableQ можно упростить, если ValueQ используется:

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

Edit 2

как указывает @dreeves, это может желательно отфильтровать видимые переменные, значения которых являются функциями, например f = (#+1)&:

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

это определение может быть легко расширено для проверки других функциональных форм, таких как интерполяционные функции, автоматически загружаемые символы и т. д.


можно считать, что переменная является Global` символ, который не проходит FunctionQ.