В Python все является объектом.
Три основных элемента, содержащиеся в объектах в Python: id (идентификация), type (тип данных) и value (значение). Вы можете использовать == или is для сравнения объектов на равенство.
И is, и == используются для сравнения и суждения об объектах, но содержание сравнения и суждения об объектах не одно и то же. Давайте посмотрим, в чем разница?
is сравнивает, равны ли значения id двух объектов, то есть являются ли два объекта одним и тем же экземпляром объекта и указывают ли они на один и тот же адрес памяти.
== сравнивает, равно ли содержимое двух объектов.По умолчанию будет вызываться метод __eq__() объекта.
Следующий код тестируется под Python3.5.
Разница между оператором сравнения == и оператором идентификации
== — это оператор сравнения в стандартных операторах Python, который используется для сравнения и определения того, равно ли значение (значение) двух объектов.
Код 1:
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True
Объяснить, почему? is также называется оператором идентичности, то есть одинаковы ли идентификаторы. Глядя на приведенный ниже код, идентификаторы переменных a и b различны, поэтому b==a равно True, а b равно a False.
Код 2:
>>> id(a)
4364243328
>>>
>>> id(b)
4364202696
В каких случаях результаты and == совпадают?
Код 3:
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a == b
True
>>>
>>> a = 1000
>>> b = 10**3
>>> a == b
True
>>> a is b
False
>>>
Вывод: типы чисел не одинаковы.
Почему на 256 одно и то же, а на 1000 другое?
Из соображений производительности Python проделал большую внутреннюю работу по оптимизации.Для целочисленных объектов Python кэширует некоторые часто используемые целочисленные объекты и сохраняет их в связанном списке, называемом small_ints.В течение всего жизненного цикла Python, в любом месте, где эти целочисленные объекты нуждаются чтобы на них ссылались, новые объекты не создаются заново, а прямо ссылаются на объекты в кэше. Python помещает эти небольшие объекты, которые могут часто использоваться в диапазоне [-5, 256], в small_ints, но всякий раз, когда вам нужно использовать небольшие целые числа, берите их отсюда и больше не создавайте временно новые объекты.
Код 4:
>>> c = 'pythontab.com'
>>> d = 'pythontab.com'
>>> c is d
False
>>> c == d
True
>>> c = 'pythontabcom'
>>> d = 'pythontabcom'
>>> c is c
True
>>> c == d
True
Вывод: типы строк не совсем одинаковы. Это связано с реализацией интерпретатора.
Код 5:
>>> a = (1,2,3) #a和b为元组类型
>>> b = (1,2,3)
>>> a is b
False
>>> a = [1,2,3] #a和b为list类型
>>> b = [1,2,3]
>>> a is b
False
>>> a = {'python':100,'com':1} #a和b为dict类型
>>> b = {'python':100,'com':1}
>>> a is b
False
>>> a = set([1,2,3])#a和b为set类型
>>> b = set([1,2,3])
>>> a is b
False
в заключении
Когда переменная является числом, строка, кортеж, список, словарь, is и == не совпадают и не могут использоваться взаимозаменяемо! При сравнении значений используйте ==, а используйте is при сравнении того, являются ли они одним и тем же адресом памяти. Конечно, случаев сравнения значений в разработке больше.