Я хотел сделать то же самое, но я не мог получить семя. Итак, я думал, потому что семя генерируется со временем. Я создал свое семя, используя системное время, и использовал его как семя, поэтому теперь я знаю, какое семя было использовано.
SEED = int (time.time ()) random.seed (SEED) [ ! d0]
SO может у вас есть два разных экземпляра (скажем) строки из «Боба» и заставить их не возвращать true при сравнении с помощью «is»? Или это infact так же, как ===?
blockquote>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, Алгоритм сравнения строгого равенства определяется следующим образом
blockquote>
- Если Тип (x) отличается от Тип (y), return false.
- Если Type (x) не определено, верните 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.
- Если Type (x) является логическим, верните true, если x и y оба true или оба false; в противном случае возвращаем false.
- Возвращает true, если x и y относятся к одному и тому же объекту. В противном случае вернем false.
Final Conclusion
Мы не можем сравнивать оператор
is
и [j15] оператора Python, поскольку Pythonis
оператор выполняет только последний элемент в алгоритме сравнения строгого равенства.7. Return true if x and y refer to the same object. Otherwise, return false.
>>> 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
Или все, что на самом деле вычисляет строки.
Полностью отличается.
>>> a = 'foo'
>>> b = 'bar'
>>> a + b is 'foobar'
False
>>> 1000 + 1 is 1001
False
True
. Нет ответа на эту тему, без развенчания.
– user
14 February 2014 в 10:53
Ключевое слово is
Python сравнивает ссылки (а также об идентичности), в то время как ===
выполняет минимальное количество принуждения (и поэтому имеет отношение к равенству, по крайней мере, в случае примитивов) поэтому они разные.
Насколько я понимаю, вещи, связанные с идентификацией, связаны с уникальностью с точки зрения времени выполнения (эти две переменные указывают на один и тот же адрес в памяти), в то время как равенство с единственностью содержимого переменных (эквивалентны эти две переменные, независимо от того, где они помещены в память относительно друг друга).
NaN
или 0
. Сравните ===
с SameValue
- NaN
is NaN
, но он не равен NaN
, а -0
не +0
, но они равны. Это имеет смысл (для меня очень поздно / рано, так что я могу говорить через шляпу).
– Sean Vieira
14 February 2014 в 11:42
is
. И это не та часть, которая нуждается в правиле pf thumb ;-) – user 14 February 2014 в 10:59