Как работает "is" в python? - PullRequest
8 голосов
/ 04 июня 2011

Может кто-нибудь объяснить, как можно использовать «находится» в условии «если». Я работаю с модулем фракций, и у меня возникли некоторые проблемы:

>>> Fraction(0, 1) is 0
False
>>> float(Fraction(0, 1))
0.0
>>> float(Fraction(0,1)) is 0.0
False

Единственное, что я нашел для работы:

>>> F = Fraction(a,b)
>>> if F >= 0:
...     if F(0, 1) <= 0:
...                      ...

Есть ли способ использовать здесь "есть"? Спасибо.

Ответы [ 5 ]

7 голосов
/ 04 июня 2011

Оператор is в python используется для проверки, указывают ли две переменные на один и тот же объект, и не предназначен для проверки числового равенства. Вместо этого вы должны использовать ==.

Например, рассмотрим, что

(1000 + 1000) is (1000 + 1000)

возвращает False.

7 голосов
/ 04 июня 2011

С документация :

Операторы is и is not проверяют идентичность объекта: x is y имеет значение true, если и только если x и y являютсятот же объект.x is not y возвращает значение обратной истинности.

Здесь вы хотите ==, чтобы проверить, равны или эквивалентны два объекта, с помощью , сравнивая значения , а не тождества.

Тривиальный пример (в CPython , который может отличаться в других реализациях):

>>> 1 + 2 == 3.0
True
>>> 1 + 2 is 3.0
False
>>> 1 + 2 is 3
True
>>> id(1 + 2)
4298185512
>>> id(3.0)
4298194656
>>> id(3)
4298185512
5 голосов
/ 04 июня 2011

is проверяет идентичность объекта. Возвращает true, если два имени ссылаются на один и тот же объект. Один из типичных вариантов использования - проверить, относится ли имя к None:

if foo is None:
    # do stuff
2 голосов
/ 04 июня 2011

a is b эквивалентно id(a) == id(b)

0 голосов
/ 04 июня 2011

Цитата от http://docs.python.org/library/operator.html:

operator.is_ (a, b) Возвращаемое значение a равно b. Проверяет идентичность объекта.

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