Python 'is' vs JavaScript ===

Использование Python для 'is' похоже на JavaScript '===', но не совсем.

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

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

SO может у вас есть два разных экземпляра (скажем) строки из "Боба" и заставить их не возвращать true при сравнении с помощью "is"? Или он имеет значение так же, как ===?

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

Ответ 1

Часть Python

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

a = "Bob"
b = "{}".format("Bob")
print a, b
print a is b, a == b

Выход

Bob Bob
False True

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

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

print 3 is 2+1
print 300 is 200+100

Выход

True
False

Это связано с тем, что небольшие ints (от -5 до 256) в Python кэшируются внутри. Таким образом, всякий раз, когда они используются в программах, используются кешированные целые числа. Итак, is вернет True для них. Но если мы выберем большее число, как во втором примере (300 is 200+100), это не правда, потому что они НЕ кэшированы.

Вывод:

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

Правило большого пальца:

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


Часть JavaScript

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

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

  • Если Type (x) отличается от Type (y), верните false.
  • Если тип (x) равен Undefined, верните true.
  • Если Type (x) - Null, верните true.
  • Если Type (x) - Number, то
    • Если x является NaN, верните false.
    • Если y является NaN, верните false.
    • Если x - это то же значение числа, что и y, верните true.
    • Если x равно +0 и y равно -0, верните true.
    • Если x равно -0 и y равно +0, верните true.
    • Возвращает false.
  • Если Type (x) - String, тогда верните true, если x и y - это точно такая же последовательность символов (одинаковая длина и одинаковые символы в соответствующие должности); в противном случае верните false.
  • Если тип (x) является логическим, верните true, если x и y оба true или оба ложный; в противном случае верните false.
  • Возвращает true, если x и y относятся к одному и тому же объекту. В противном случае верните ложь.

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

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

7. Return true if x and y refer to the same object. Otherwise, return false.

Ответ 2

Совершенно иная.

>>> a = 'foo'
>>> b = 'bar'
>>> a + b is 'foobar'
False
>>> 1000 + 1 is 1001
False

Ответ 3

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

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

Ответ 4

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

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

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

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


Реальным выходом False должно быть:

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

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