Разница между == и === в 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? Я просматривал документацию, но я все еще не совсем понимаю он.
5 ответов
одним важным отличием является то, что ===
всегда возвращает True
или False
. ==
может возвращать unevaluated (вот почему это полезно для представления уравнений.)
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>]
.
==
и ===
очень похожи в том смысле, что она возвращает True
Если lhs и rhs равны. Один из примеров, когда они отличаются, - это сравнение чисел в разных форматах представления.
In: 5.==5
Out: True
In: 5.===5
Out: False
хотя они одинаковы численно, (вот почему ==
возвращает True
), они не совсем идентичны.
FYI, они различные функции внутренне. ==
is Equal
, а ===
и SameQ
.
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
LHS===rhs дает True если выражение lhs идентично rhs, и дает False в противном случае.
и
LHS==rhs возвращает True, если LHS и rhs идентичны.