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

Это было через пару дней с тех пор, как я начал изучать питон, и в этот момент я наткнулся на == и is . Исходя из java-фона, я предположил, что == сравнивает идентификатор объекта и is ценность, однако делает

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

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

4 Solutions collect form web for “== и находится в python”

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

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

  • '==' проверяет равенство,
  • 'is' проверяет личность

Смотрите также

Почему сравнение строк в Python с использованием «==» или «is» иногда приводит к другому результату?

Чтобы следить за ответом @ CRUSADER:

== проверяет равенство объектов, используя метод eq .

проверяет фактическое местоположение памяти объектов. Если они совпадают с местом памяти, они проверяются как 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 [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

В [14]: b = 1001 # этот экземпляр нового объекта в памяти
В [15]: a == b
Out [15]: True
В [16]: a – b
Out [16]: False # в то время как места памяти различны
В [17]: id (a)
Выезд [17]: 14125728
В [18]: id (b)
Out [18]: 14125824

Разница между 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, становится немного легче понять это.

  • Как определить свободную переменную в python?
  • Перейти к определенной строке в Python?
  • Сценарий Python в браузере
  • Объявление переменной Python
  • Python for-loop look-ahead
  • Как получить номер версии модуля python через код?
  • не зависящая от регистра алфавитная сортировка вложенных списков
  • Что это за оператор * = -1
  • Python - лучший язык программирования в мире.