Почему сравнение строк с помощью '==' и 'is' иногда дает разные результаты?
У меня возникла проблема с сравлением строк в Python. У меня есть две переменные-строки, которые установлены на одно и то же значение. Сравнение с помощью оператора ==
всегда возвращает True
, но оператор is
иногда возвращает False
.
Например, когда я открываю интерпретатор Python и выполняю следующее сравнение:
s1 = 'text'
s2 = 'text'
s1 is s2
Результат оказывается True
.
Почему это происходит? Какова разница между операторами ==
и is
в этом контексте?
5 ответ(ов)
is
используется для проверки идентичности объектов, тогда как ==
проверяет их равенство по значению. То, что происходит в вашем коде, можно смоделировать в интерпретаторе следующим образом:
>>> a = 'pub'
>>> b = ''.join(['p', 'u', 'b'])
>>> a == b
True
>>> a is b
False
Так что неудивительно, что они не равны, верно?
Другими словами: a is b
эквивалентно проверке id(a) == id(b)
.
Ключевое слово is
проверяет идентичность объектов, тогда как ==
используется для сравнения значений.
Если вы используете is
, результат будет истинным только в том случае, если оба объекта являются одним и тем же объектом в памяти. В то время как ==
вернет true в любой ситуации, если значения этих объектов одинаковы.
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
. Строка может быть эквивалентна другой, но это не один и тот же объект.
Если вы не уверены, что делаете, используйте оператор ==
. Если у вас есть немного больше знаний об этом, вы можете использовать is
для известных объектов, таких как None
.
В противном случае вы можете оказаться в недоумении, почему все не работает так, как ожидается, и почему происходят такие ситуации:
>>> a = 1
>>> b = 1
>>> b is a
True
>>> a = 6000
>>> b = 6000
>>> b is a
False
Я даже не уверенный, что некоторые вещи гарантированно останутся одинаковыми между разными версиями и реализациями Python.
Согласно моему ограниченному опыту работы с Python, is
используется для сравнения двух объектов с целью выяснить, являются ли они одним и тем же объектом, в то время как ==
используется для определения, идентичны ли значения объектов.
Вот хороший пример:
>>> s1 = u'public'
>>> s2 = 'public'
>>> s1 is s2
False
>>> s1 == s2
True
s1
— это строка в кодировке Unicode, а s2
— обычная строка. Они имеют разные типы, но их значения идентичны.
Есть ли в Python метод подстроки 'contains' для строк?
Как удалить пробелы?
Объединение двух столбцов текста в DataFrame pandas
Как получить имя функции в виде строки?
Вывод строки в текстовый файл