Список всех глобальных переменных
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
.