Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > в чём разница между "==" и "is"


Автор: antsh85 21.9.2009, 19:28
в чём разница между "==" и "is"

по идее в одном случае должна проверяться ссылка на объект, а в другом его реальный валуе - по крайней мере так в яве.

Автор: kosmonaFFFt 21.9.2009, 19:34
== проверяет равенство объектов, is - принадлежность объекта классу,
но я могу и ошибаться...

Автор: Void 21.9.2009, 19:45
Цитата(antsh85 @  21.9.2009,  21:28 Найти цитируемый пост)
по идее в одном случае должна проверяться ссылка на объект, а в другом его реальный валуе - по крайней мере так в яве. 

Совершенно верно. == — это структурное равенство (переопределяется методом __cmp__), is — это равенство ссылок.
Код
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> c = a
>>> a == b
True
>>> a is b
False
>>> a == c
True
>>> a is c
True

Автор: Fatkh 21.9.2009, 19:46
Цитата(antsh85 @  21.9.2009,  17:28 Найти цитируемый пост)
в чём разница между "==" и "is"

по идее в одном случае должна проверяться ссылка на объект, а в другом его реальный валуе - по крайней мере так в яве. 


Оператор == проверяет, равны ли значения объектов.
Оператор is проверяет, один и тот же это объект в памяти или нет. Фактически он сравнивает указатели, через которые реализованы ссылки.

Так, если 
l = ['a', 'b']
m = ['a', 'b']
то:
>>> l == m
True
>>>l is m
False

Автор: _Viper_ 21.9.2009, 19:47
Цитата(kosmonaFFFt @  21.9.2009,  19:34 Найти цитируемый пост)
== проверяет равенство объектов, is - принадлежность объекта классу,

несовсем так, проще всего показать на примере
Код

>>> a = [1, ]
>>> b = [1, ]
>>> a is b
False
>>> a == b
True

Автор: Fatkh 21.9.2009, 19:51
Но, если быть совсем честными, то никто не гарантирует, что 
>>> a = [1, ]
>>> b = [1, ]
>>> a is b
False
>>> a == b
True

На самом деле если (вдруг) создателям интерпретатора захочется, они могут закешировать первый список, и тогда ссылаться будут a и b на одно и то же. Для целых чисел так и сделано. То есть на is лучше никогда не полагаться.

Автор: antsh85 21.9.2009, 21:19
спасибо всем больше за разъяснения.

Автор: _Viper_ 22.9.2009, 14:49
 
Цитата(Fatkh @  21.9.2009,  19:51 Найти цитируемый пост)
На самом деле если (вдруг) создателям интерпретатора захочется, они могут закешировать первый список, и тогда ссылаться будут a и b на одно и то же. Для целых чисел так и сделано. То есть на is лучше никогда не полагаться.

Зато сравнение через is происходит намного быстрее и если надо сравнить переменную с None, то советуют делать это именно через is. 
Да и кешировать списки не будут поскольку это изменяемые обьекты, потом проблем не оберёшся с таким кешированием.

Автор: Fatkh 22.9.2009, 15:12
Цитата(_Viper_ @  22.9.2009,  12:49 Найти цитируемый пост)
Зато сравнение через is происходит намного быстрее и если надо сравнить переменную с None, то советуют делать это именно через is. 
Да и кешировать списки не будут поскольку это изменяемые обьекты, потом проблем не оберёшся с таким кешированием. 

Не спорю. И никто не будет кешировать списки), конечно. Просто перед использованием is стоит подумать, сработает ли.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)