Разница между == и === в Mathematica - PullRequest
11 голосов
/ 13 марта 2011

У меня сложилось впечатление, что = - это задание, == - числовое сравнение, а === - символьное сравнение (как и в некоторых других языках ==, являющееся equal to и * 1006).* будучи 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 ]

14 голосов
/ 13 марта 2011

Одно важное отличие состоит в том, что === всегда возвращает 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>].

13 голосов
/ 13 марта 2011

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
13 голосов
/ 13 марта 2011

== и === очень похожи в том смысле, что они возвращают True, если lhs и rhs равны. Один из примеров, где они различаются, - это сравнение чисел в разных форматах представления.

In: 5.==5
Out: True

In: 5.===5
Out: False

Хотя они численно одинаковы (поэтому == возвращает True), они не совсем идентичны.

К вашему сведению, это разные функции внутри страны. == означает Equal, тогда как === означает SameQ.

7 голосов
/ 13 марта 2011

lhs === rhs возвращает True, если Выражение lhs идентично rhs, и возвращает False в противном случае.

и

lhs == rhs возвращает True, если lhs и rhs идентичны.

Ссылка от здесь и здесь .

2 голосов
/ 13 марта 2011

Я направляю вас в раздел 2.5: Проверка на равенство превосходной книги Леонида Шифрина.

...