Разница между == и === в Mathematica
У меня создалось впечатление, что =
является присваиванием, ==
является числовым сравнением, а ===
является символическим сравнением (а также в некоторых других языках ==
equal to
и ===
identical to
. Однако, глядя на следующее, казалось бы, это не обязательно так...
In: x == x
Out: True
In: x === x
Out: True
In: 5 == 5
Out: True
In: 5 === 5
Out: True
In: x = 5
Out: 5
In: 5 == x
Out: True
In: 5 === x
Out: True
In: 5 5 == 5x
Out: True
In: 5 5 === 5x
Out: True
In: x == y
Out: x == y
In: x === y
Out: False
In: y = x
Out: 5
In: x == y
Out: True
In: x === y
Out: True
Так что же такое разница между == и === в Mathematica? Я смотрел документацию, но я все еще не совсем понимаю ее.
Ответы
Ответ 1
Важным отличием является то, что ===
всегда возвращает True
или False
. ==
может возвращать неоцененный (поэтому он полезен для представления уравнений.)
In[7]:= y == x^2 + 1
Out[7]= y == 1 + x^2
In[8]:= y === x^2 + 1
Out[8]= False
Есть несколько интересных случаев, когда ==
возвращает неоценимые значения, о которых стоит знать при программировании. Например:
In[10]:= {} == 1
Out[10]= {} == 1
который может влиять на такие вещи, как If[foo=={}, <true>, <false>]
.
Ответ 2
==
и ===
очень похожи в том смысле, что он возвращает True
, если lhs и rhs равны. Один из примеров, когда они отличаются, - это сравнение чисел в разных форматах представления.
In: 5.==5
Out: True
In: 5.===5
Out: False
Хотя они одинаковы численно (поэтому ==
возвращает True
), они не совсем идентичны.
FYI, они являются разными функциями внутри. ==
- Equal
, тогда как ===
- SameQ
.
Ответ 3
Equal
относится к семантическому равенству, тогда как SameQ
является синтаксическим равенством. Например, Sin[x]^2+Cos[x]^2
и 1
- одинаковое число, поэтому они равнозначны. Поскольку это невозможно определить без каких-либо преобразований, Equal
возвращает unevaluated. Однако фактические выражения различны, поэтому SameQ
дает False
.
Sin[x]^2 + Cos[x]^2 == 1
Sin[x]^2 + Cos[x]^2 === 1
Simplify[Sin[x]^2 + Cos[x]^2 == 1]
Обратите внимание, что специальная обработка чисел Real
, SameQ[a,b]
может возвращать True
, если a
и b
отличаются в последней двоичной цифре. Чтобы сделать более ограничительное тестирование идентичности, используйте Order[a,b]==0
a = 1. + 2^-52;
b = 1.;
a === b
Order[a, b]==0
SameQ
может возвращать True
для синтаксически различающихся выражений, поскольку главы выражений могут сортировать аргументы автоматически. Вы можете предотвратить автоматическую сортировку с помощью удерживающих атрибутов. Например,
c + d === d + c
SetAttributes[SameQ, HoldAll]
c + d === d + c
Ответ 4
lhs === rhs дает True, если выражение lhs идентично rhs, и дает False в противном случае.
и
lhs == rhs возвращает True, если lhs и rhs идентичны.
Ссылка из здесь и здесь.
Ответ 5
Я направляю вас в раздел 2.5: Проверка равенства отличной книги Леонида Шифрина.