Если мы рассмотрим любой символ с собственным значением как «переменную», то это поможет:
ClearAll[variableQ]
variableQ[name_String] := {} =!= ToExpression[name, InputForm, OwnValues]
Select[Names["Global`*"], variableQ]
Обратите внимание, что этот метод не будет работать на символах, защищенных от чтения, и будет неправильно идентифицировать некоторыеформы автоматически загружаемых функций.
Редактировать 1
Как указывает @Szabolcs, определение variableQ
может быть упрощено, если используется ValueQ
:
variableQ[name_String] := ToExpression[name, InputForm, ValueQ]
Редактировать 2
Как указывает @dreeves, может быть желательно отфильтровать видимые переменные, значения которых являются функциями, например, f = (#+1)&
:
variableQ[name_String] :=
MatchQ[
ToExpression[name, InputForm, OwnValues]
, Except[{} | {_ :> (Function|CompiledFunction)[___]}]
]
Это определение может быть легко расширено для проверки других функционально-подобных форм, таких как интерполяционные функции, автоматически загружаемые символы и т. Д.