== и находится в python
Прошло несколько дней с тех пор, как я начал изучать питон, после чего наткнулся на ==
и is
. Исходя из фона java, я предположил, что ==
выполняет сравнение по идентификатору объекта и is
по значению, однако делает
>>> a = (1,2)
>>> b = (1,2)
>>> a is b
False
>>> a == b
True
Кажется, что is
эквивалентно java ==
, а python ==
эквивалентно java equals()
. Это правильный способ подумать о разнице между is
и ==
? Или есть оговорка?
Ответы
Ответ 1
is
проверяет, что оба операнда являются одним и тем же объектом. ==
вызывает __eq__()
в левом операнде, передавая право. Обычно этот метод реализует сравнение равенства, но можно написать класс, который использует его для других целей (но он никогда не должен).
Обратите внимание, что is
и ==
будут давать одни и те же результаты для некоторых объектов (строковые литералы, целые числа от -1 до 256 включительно) на некоторых реализациях, но это не означает, что операторы должны считаться взаимозаменяемыми в тех ситуации.
Ответ 2
- '==' проверяет равенство,
- 'is' проверяет подлинность
См. также
Почему сравнение строк в Python с использованием "==" или "is" иногда приводит к другому результату?
Ответ 3
Для ответа на @CRUSADER ответ:
==
проверяет равенство объектов, используя метод eq.
is
проверяет фактическое местоположение памяти объектов. Если они являются одинаковым местом памяти, они проверяются как True
Как уже упоминалось выше, первые 2 ** 8 целых чисел сохраняются в ячейках памяти для скорости, поэтому, чтобы увидеть, что происходит, используйте какой-либо другой объект или целые числа выше 256. Например:
In [8]: a = 1001
In [9]: b = a # this sets a pointer to a for the variable b
In [10]: a == b
Out[10]: True # of course they are equal
In [11]: a is b
Out[11]: True # and they point to the same memory location
In [12]: id(a)
Out[12]: 14125728
In [13]: id(b)
Out[13]: 14125728
In [14]: b = 1001 #this instantiates a new object in memory
In [15]: a == b
Out[15]: True
In [16]: a is b
Out[16]: False #now the memory locations are different
In [17]: id(a)
Out[17]: 14125728
In [18]: id(b)
Out[18]: 14125824
Ответ 4
Разница между is и == запуталась и изначально, так как они оба, похоже, имеют одинаковое влияние на строки. Это сходство исчезает для любых изменяемых объектов (которые не являются псевдонимом... который является одной из вещей, полезен для обнаружения: aliasing), который вы пытаетесь сравнить с is. Копирование изменяемого объекта - это самый простой способ увидеть это. Я продемонстрирую это, а также полезность при обнаружении псевдонимов ниже:
>>> a=[1,2,3]
>>> b=a[:]
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
>>> a==b
True
>>> a is b
False
>>> c=a
>>> a==c
True
>>> a is c
True
>>>
(взято непосредственно из оболочки IDLE)
Обратите внимание, что == по существу сравнивает значение, а сравнивает идентификатор объекта (расположение памяти объекта, которое можно получить с помощью id (some_object)). Это может быть немного запутанным, но если вы понимаете, как данные хранятся в python, становится немного легче понять это.