is & ldquo; === & rdquo; в JavaScript & nbsp; & nbsp; & nbsp; (оператор идентичности) в python? [Дубликат]

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

  SEED = int (time.time ()) random.seed (SEED) [  ! d0] 
11
задан R Claven 14 February 2014 в 10:48
поделиться

4 ответа

Python Part

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

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 к объектам cache / intern. В этом случае is вернет True)

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

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


Часть JavaScript

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

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

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

Final Conclusion

Мы не можем сравнивать оператор is и [j15] оператора Python, поскольку Python is оператор выполняет только последний элемент в алгоритме сравнения строгого равенства.

7. Return true if x and y refer to the same object. Otherwise, return false.
11
ответ дан ghosh 16 August 2018 в 03:04
поделиться
  • 1
    «Правило большого пальца» на самом деле является полным определением is. И это не та часть, которая нуждается в правиле pf thumb ;-) – user 14 February 2014 в 10:59
  • 2
    @delnan Надеюсь, это понятно :) – thefourtheye 14 February 2014 в 11:01
  • 3
    Это очень полезно. Спасибо! – R Claven 16 February 2014 в 05:36
  • 4
    @RClaven Добро пожаловать :) – thefourtheye 16 February 2014 в 05:37
>>> 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

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

3
ответ дан Bakuriu 16 August 2018 в 03:04
поделиться
  • 1
    Также обратите внимание, что это компилятор, который фактически ставит литераторы. – Ignacio Vazquez-Abrams 14 February 2014 в 10:55
  • 2
    @thefourtheye Исправлено. – Bakuriu 14 February 2014 в 10:59
  • 3
    «компилятор свободен для внутренних строковых литералов». ?? Pls объясняет? – R Claven 7 March 2018 в 22:20
  • 4
    @RClaven Что вы имеете в виду? – Bakuriu 8 March 2018 в 21:38

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

>>> a = 'foo'
>>> b = 'bar'
>>> a + b is 'foobar'
False
>>> 1000 + 1 is 1001
False
5
ответ дан Ignacio Vazquez-Abrams 16 August 2018 в 03:04
поделиться
  • 1
    Коварная часть состоит в том, что существует множество наивных тестов, которые do вывод True. Нет ответа на эту тему, без развенчания. – user 14 February 2014 в 10:53

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

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

4
ответ дан Sean Vieira 16 August 2018 в 03:04
поделиться
  • 1
    Я удивлен этим обсуждением (ссылка, пожалуйста?), Поскольку различия отображаются только в типах «примитивных» / не-объектов, которые в любом случае являются особыми и не имеют идентичности как таковой. Конечно, есть эквиваленты в коробке, и они, вероятно, могут быть построены неявно, но поскольку это создало бы отдельные объекты-обертки для обоих аргументов, что делает его длинным способом не рассматривать любые примитивы, равные любым другим примитивам. Я что-то упускаю? – user 14 February 2014 в 11:07
  • 2
    в объектах js сравниваются для идентичности и примитивов для равенства ... – dandavis 14 February 2014 в 11:16
  • 3
    @delnan - true, это влияет только на примитивы, но иногда вы ссылаетесь на семантику переменных, которые могут содержать примитивы типа NaN или 0. Сравните === с SameValue - NaN is NaN, но он не равен NaN, а -0 не +0, но они равны. Это имеет смысл (для меня очень поздно / рано, так что я могу говорить через шляпу). – Sean Vieira 14 February 2014 в 11:42
Другие вопросы по тегам:

Похожие вопросы: