Python 'is' vs JavaScript ===

Использование Python для «a =» Bob «b =« {} ». Format (« Bob ») print a, b print a is b, a == b 'похоже на JavaScript« Bob Bob False True », но не совсем.

Здесь они рассказывают о конкретных случаях: http://www.learnpython.org/en/Conditions

здесь (для JS) они говорят о «равном И того же типа». http://www.w3schools.com/js/js_comparTrue False ons.asp

ТАК, можете ли вы иметь два разных экземпляра (скажем) строки «Боб» и не вернуть их при сравнении с помощью «Истина»? Или 300 составляет 200 + 100, это значит, что это так же, как есть?

Я предполагаю, что thTrue связан со строгими и нестрогими типизированными языками. , , ,

javascript,python,

11

Ответов: 4


11 принят

Часть Python

Итак, у вас есть два разных экземпляра (скажем) строки «Боб» и не возвращать ли они True при сравнении с «is»? Или это инфакт так же, как ===?

is

Вывод

is

Примечание. В большинстве реализаций Python время компиляции Строки интернированы .

Другой пример,

===

Вывод

is

Это связано с тем, что небольшие ints (от -5 до 256) в Python кэшируются внутри. Таким образом, всякий раз, когда они используются в программах, используются кешированные целые числа. Итак, isвернется 7. Return true if x and y refer to the same object. Otherwise, return false. для них. Но если мы выберем большие числа, как во втором примере, ( >>> a = 'foo' >>> b = 'bar' >>> a + b is 'foobar' False >>> 1000 + 1 is 1001 False ) это не так, потому что они НЕ кэшированы.

Вывод:

isбудет возвращаться Trueтолько тогда, когда сравниваемые объекты являются одним и тем же объектом, что означает, что они указывают на одно и то же место в памяти. (Это зависит только от реализации python к кеш-объектам / стажерам. В этом случае isвернется True)

Практическое правило:

НИКОГДА не используйте isоператор, чтобы проверить, имеют ли два объекта одинаковое значение.


Часть JavaScript

Другая часть вашего вопроса касается оператора ===. Посмотрим, как работает этот оператор.

Цитирование из спецификаций ECMA 5.1. Алгоритм сравнения строгого равенства определяется следующим образом:

  1. Если Type (x) отличается от Type (y), return ===.
  2. Если Type (x) Undefined, верните true.
  3. Если Type (x) - Null, верните true.
  4. Если Type (x) - Number, то
    1. Если x является NaN, верните false.
    2. Если y является NaN, верните false.
    3. Если x - это то же значение числа, что и y, верните true.
    4. Если x равно +0 и y равно? 0, верните true.
    5. Если x равно 0, а y равно +0, верните true.
    6. Вернуть false.
  5. Если Type (x) - String, то верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующих позициях); в противном случае верните false.
  6. Если Type (x) является логическим, верните true, если x и y оба true или оба false; в противном случае верните false.
  7. Верните true, если x и y относятся к одному и тому же объекту. В противном случае верните false.

Окончательное заключение

Мы можем НЕ сравнивать Пайтон isоператора и в JavaScript ===оператор, так как в Python isоператор делает только последний пункт в строгом равенстве Сравнения алгоритма.

>>> a = "Hello, World!!!"
>>> b = "Hello, World!!!"
>>> a is b
False

Полностью отличается.

>>> a = "Bob"
>>> b = "Bob"
>>> a is b
True

4

isКлючевое слово Python сравнивает ссылки (а также об идентичности), а ===также минимальное количество принуждения (и поэтому связано с равенством, по крайней мере, в случае примитивов), поэтому они разные.

Насколько я понимаю, все, что касается идентичности, связано с уникальностью с точки зрения времени выполнения (эти две переменные указывают на один и тот же адрес в памяти), в то время как равенство связано с уникальностью содержимого переменных (эти две переменные эквивалентны, независимо от того, где они размещены в памяти относительно друг друга).


3
True

Однако обратите внимание, что:

False

В этом случае это условие заключалось в том, Trueчто компилятор может свободно вводить строковые литералы и, таким образом, повторно использовать один и тот же объект, и он делает это с помощью небольших строк. Однако нет никакой гарантии, когда это произойдет, если это вообще произойдет, и изменения поведения между версиями и реализациями.


Реализуемая Falseпродукция должна быть:

>>> a = 'Hello, World!!!!'[:-1]
>>> b = 'Hello, World!!!!'[:-1]
>>> a is b
False

Или что-нибудь, что на самом деле вычисляет строки.

JavaScript, Python,
Похожие вопросы