Подтвердить что ты не робот

== и находится в python

Прошло несколько дней с тех пор, как я начал изучать питон, после чего наткнулся на == и is. Исходя из фона java, я предположил, что == выполняет сравнение по идентификатору объекта и is по значению, однако делает

 >>> a = (1,2)
 >>> b = (1,2)
 >>> a is b
 False
 >>> a == b
 True

Кажется, что is эквивалентно java ==, а python == эквивалентно java equals(). Это правильный способ подумать о разнице между is и ==? Или есть оговорка?

4b9b3361

Ответ 1

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

Обратите внимание, что is и == будут давать одни и те же результаты для некоторых объектов (строковые литералы, целые числа от -1 до 256 включительно) на некоторых реализациях, но это не означает, что операторы должны считаться взаимозаменяемыми в тех ситуации.

Ответ 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, становится немного легче понять это.