Ответ 1
Если мы рассмотрим любой символ с собственным значением как "переменную", тогда это сделает трюк:
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)[___]}]
]
Это определение может быть легко расширено для проверки других функциональноподобных форм, таких как функции интерполяции, автозагруженные символы и т.д.