Лучше использовать «is» или «==» для сравнения чисел в Python? - PullRequest
51 голосов
/ 10 февраля 2010

Лучше ли использовать оператор "is" или оператор "==" для сравнения двух чисел в Python?

Примеры:

>>> a = 1
>>> a is 1
True
>>> a == 1
True
>>> a is 0
False
>>> a == 0
False

Ответы [ 6 ]

82 голосов
/ 10 февраля 2010

Используйте ==.

Иногда в некоторых реализациях Python по совпадению целые числа от -5 до 256 будут работать с is (например, в реализациях CPython). Но не полагайтесь на это и не используйте его в реальных программах.

24 голосов
/ 10 февраля 2010

Другие ответили на ваш вопрос, но я подробнее расскажу:

Python is сравнивает идентичность - он задает вопрос "действительно ли это одна вещь - тот же объект, что и другая вещь" (аналогично == в Java) Таким образом, бывают случаи, когда использование is имеет смысл - наиболее распространенным является проверка на None. Например, foo is None. Но, в общем, это не то, что вы хотите.

==, с другой стороны, задает вопрос "является ли эта вещь логически эквивалентной этой другой вещи". Например:

>>> [1, 2, 3] == [1, 2, 3]
True
>>> [1, 2, 3] is [1, 2, 3]
False

И это правда, потому что классы могут определять метод, который они используют для проверки на равенство:

>>> class AlwaysEqual(object):
...     def __eq__(self, other):
...         return True
...
>>> always_equal = AlwaysEqual()
>>> always_equal == 42
True
>>> always_equal == None
True

Но они не могут определить метод, используемый для проверки личности (т. Е. Они не могут переопределить is).

12 голосов
/ 10 февраля 2010
>>> a = 255556
>>> a == 255556
True
>>> a is 255556
False

Я думаю, что должен ответить на это; -)

Причина в том, что некоторые часто используемые объекты, такие как логические значения True и False, все однобуквенные строки и короткие числа выделяются интерпретатором один раз, и каждая переменная, содержащая этот объект, ссылается на него. Другие числа и строки большего размера выделяются по запросу. Например, 255556 выделяется три раза, каждый раз, когда создается другой объект. И поэтому, согласно is, они не одинаковы.

6 голосов
/ 10 февраля 2010

Это будет работать только для небольших чисел, и я предполагаю, что это также зависит от реализации. Python использует один и тот же экземпляр объекта для небольших чисел (iirc <256), но это меняется для больших чисел. </p>

>>> a = 2104214124
>>> b = 2104214124
>>> a == b
True
>>> a is b
False

Так что вы всегда должны использовать == для сравнения чисел.

1 голос
/ 10 февраля 2010

== это то, что вы хотите, "это" просто работает на ваших примерах.

0 голосов
/ 10 февраля 2010
>>> 2 == 2.0
True
>>> 2 is 2.0
False

Использование ==

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...