Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> в чём разница между "==" и "is" 
:(
    Опции темы
antsh85
Дата 21.9.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.1.2008

Репутация: нет
Всего: нет



в чём разница между "==" и "is"

по идее в одном случае должна проверяться ссылка на объект, а в другом его реальный валуе - по крайней мере так в яве.
PM   Вверх
kosmonaFFFt
Дата 21.9.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 538
Регистрация: 14.4.2008
Где: Иннополис

Репутация: нет
Всего: 5



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


--------------------
user posted image
PM MAIL ICQ   Вверх
Void
Дата 21.9.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



Цитата(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



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Fatkh
Дата 21.9.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 5.9.2009

Репутация: нет
Всего: 1



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

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


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

Так, если 
l = ['a', 'b']
m = ['a', 'b']
то:
>>> l == m
True
>>>l is m
False
PM MAIL Jabber   Вверх
_Viper_
Дата 21.9.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



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

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

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

PM MAIL   Вверх
Fatkh
Дата 21.9.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 5.9.2009

Репутация: нет
Всего: 1



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

На самом деле если (вдруг) создателям интерпретатора захочется, они могут закешировать первый список, и тогда ссылаться будут a и b на одно и то же. Для целых чисел так и сделано. То есть на is лучше никогда не полагаться.
PM MAIL Jabber   Вверх
antsh85
Дата 21.9.2009, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.1.2008

Репутация: нет
Всего: нет



спасибо всем больше за разъяснения.
PM   Вверх
_Viper_
Дата 22.9.2009, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 8.11.2006

Репутация: 10
Всего: 11



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

Зато сравнение через is происходит намного быстрее и если надо сравнить переменную с None, то советуют делать это именно через is. 
Да и кешировать списки не будут поскольку это изменяемые обьекты, потом проблем не оберёшся с таким кешированием.
PM MAIL   Вверх
Fatkh
Дата 22.9.2009, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 5.9.2009

Репутация: нет
Всего: 1



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

Не спорю. И никто не будет кешировать списки), конечно. Просто перед использованием is стоит подумать, сработает ли.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0892 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.