13

Почему сравнение строк с помощью '==' и 'is' иногда дает разные результаты?

13

У меня возникла проблема с сравлением строк в Python. У меня есть две переменные-строки, которые установлены на одно и то же значение. Сравнение с помощью оператора == всегда возвращает True, но оператор is иногда возвращает False.

Например, когда я открываю интерпретатор Python и выполняю следующее сравнение:

s1 = 'text'
s2 = 'text'
s1 is s2

Результат оказывается True.

Почему это происходит? Какова разница между операторами == и is в этом контексте?

5 ответ(ов)

16

is используется для проверки идентичности объектов, тогда как == проверяет их равенство по значению. То, что происходит в вашем коде, можно смоделировать в интерпретаторе следующим образом:

>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False

Так что неудивительно, что они не равны, верно?

Другими словами: a is b эквивалентно проверке id(a) == id(b).

1

Ключевое слово is проверяет идентичность объектов, тогда как == используется для сравнения значений.

Если вы используете is, результат будет истинным только в том случае, если оба объекта являются одним и тем же объектом в памяти. В то время как == вернет true в любой ситуации, если значения этих объектов одинаковы.

0

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

Предположим, у вас есть простой объект Person. Если он называется 'Jack' и ему 23 года, он эквивалентен другому 23-летнему Джеку, но это не один и тот же человек.

class Person(object):
   def __init__(self, name, age):
       self.name = name
       self.age = age

   def __eq__(self, other):
       return self.name == other.name and self.age == other.age

jack1 = Person('Jack', 23)
jack2 = Person('Jack', 23)

jack1 == jack2 # True
jack1 is jack2 # False

Они одного возраста, но это не одинаковые экземпляры Person. Строка может быть эквивалентна другой, но это не один и тот же объект.

0

Если вы не уверены, что делаете, используйте оператор ==. Если у вас есть немного больше знаний об этом, вы можете использовать is для известных объектов, таких как None.

В противном случае вы можете оказаться в недоумении, почему все не работает так, как ожидается, и почему происходят такие ситуации:

>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False

Я даже не уверенный, что некоторые вещи гарантированно останутся одинаковыми между разными версиями и реализациями Python.

0

Согласно моему ограниченному опыту работы с Python, is используется для сравнения двух объектов с целью выяснить, являются ли они одним и тем же объектом, в то время как == используется для определения, идентичны ли значения объектов.

Вот хороший пример:

>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True

s1 — это строка в кодировке Unicode, а s2 — обычная строка. Они имеют разные типы, но их значения идентичны.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь