Разница между == и === в 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
, ==
может вернуть неоцененный (вот почему это полезно для представления уравнений.)
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
), они не совсем идентичны.
К вашему сведению, они разные функции внутри страны. ==
является Equal
, в то время как ===
является SameQ
,
Equal
относится к семантическому равенству, тогда как SameQ
это синтаксическое равенство. Например, Sin[x]^2+Cos[x]^2
а также 1
одинаковое число, поэтому они семантически равны. Поскольку это не может быть определено без дополнительных преобразований, Equal
возвращает без оценки. Однако фактические выражения отличаются, поэтому 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 идентичны.
Я направляю вас к разделу 2.5: Проверка на равенство отличной книги Леонида Шифрина.