Чтобы понять, почему MemberQ[expr,Complex]
не обязательно вернет True
для действительных значений (и может или не может вернуть True
для сложных выражений). MemberQ
не спрашивает, является ли что-то из множества реалов или что-то в этом роде.
MemberQ[expr,form]
возвращает True
, если один из элементов уровня 1 из expr
соответствует form
. Уровень 1 - это то, что вы получаете вторым сверху, если вы делаете TreeForm
. Также по умолчанию MemberQ
не смотрит на головы. Таким образом:
l = List[1 + I];
MemberQ[l, Complex, Heads -> True]
MemberQ[List@l, Complex, Heads -> True]
(*
->
True
False
*)
(часть Heads->True
должна заставить MemberQ
также взглянуть на заголовки выражений). Чтобы понять почему, посмотрите на TreeForm@l
и Treeform[List@l]
:
Таким образом, на первом уровне в первом случае стоит Complex
, а на втором уровне - Complex
. Вот почему мы получаем True
и False
выше. Можно использовать
MemberQ[List@l, Complex, -1, Heads -> True]
(*
-> True
*)
для соответствия на всех уровнях.
Наконец, чтобы увидеть, что MemberQ
действительно является структурным вопросом, попробуйте MemberQ[1 + Exp[3*I], Complex, Heads -> True]
, который дает False
, хотя первый аргумент, очевидно, является сложным.
Итак, подведем итог, MemberQ
имеет мало общего с математикой; это конструкция для проверки шаблонов в списках (или любом выражении, голова не имеет значения).
В любом случае, если кто-то собирается использовать структурные тесты, FreeQ
- это самый простой способ , тогда как Element
- это способ с математическими тестами.