Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 11, 2010 18:21:19

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Логические операции. Оператор идентичности is.

Всем привет!
Вот решил еще раз пробежаться по Книге Саммерфилд - Программирование на Python 3. И мне стал непонятен и интересен вот такой момент:
Допустим берем следующие примеры(не из книги) и смотрим результат сначала в IDLE:

Python 3.1.1 (r311:74483, Aug 17 2009, 17:02:12) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> a=''
>>> b=''
>>> a is b
True
>>> a='q'
>>> b='q'
>>> a is b
True
>>> a='qq'
>>> b='qq'
>>> a is b
True
>>> a='q q'
>>> b='q q'
>>> a is b
False
>>>
Теперь же тоже самое но в Eclipse:
#-*- coding: utf-8 -*-
a=''
b=''
print(a is b)
a='q'
b='q'
print(a is b)
a='qq'
b='qq'
print(a is b)
a='q q'
b='q q'
print(a is b)
и получаем вот такой вывод:
True
True
True
True
И вот собственно вопрос почему в последнем выводе True а не False как в IDLE?Поясните пожалуйста, очень хочу разобраться!

Ну и собственно Xp Sp3,Python 3.1,eclipse-SDK-3.6M5-win32,pydev 1.5.5.2……….



Офлайн

#2 Июнь 11, 2010 23:06:31

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Логические операции. Оператор идентичности is.

Еще один хороший вопрос!

Дело в следующем. В CPython оператор is проверяет, равны ли _адреса объектов_.

В “идеальном Питоне” все ваши проверки на ‘is’ должны вернуть False.

CPython использует механизм кеширования.
Это когда для уже существующего объекта берется он самый, а не создается новый.
Например, пустая строка всегда эквивалентна другой пустой строке - так работает конструктор str('').
Однозначно кешируются еще односимвольные строки латинского алфавита.
То же самое происходит с целыми (и некоторыми рациональными) числами.


Со строчками большей длинны ситуация не столь прозрачна.
Есть довольно сложная эвристика (смотрите unicodeobject.c), определяющая - попадет ли ваша строка в кеш или нет. CPython пытается работать с этим кешем максимально эффективно (и, поверьте, каждое изменение сопровождается тестами и бурными дебатами: ведь работа со строками и словарями составляет значительную часть главного рабочего цикла - ceval.c).

Резюме: нельзя полагаться на ‘is’ при сравнении строк. Они совпадают лишь потому, что сейчас CPython при таком поведении работает чуть-чуть быстрее.
В следующей версии все может кардинально поменяться.

Теперь, собственно, ответ на сам вопрос. IDLE написан на питоне, и ему тоже нужны строки. Кеш заканчивается, и последняя проверка уже не работает - это были два разных объекта. Создайте много-много коротких строчек в консольном скрипте - и вы тоже перешагнете этот порог.

Я понятно ответил, или нужно уточнить что-то еще?



Отредактировано (Июнь 11, 2010 23:09:36)

Офлайн

#3 Июнь 11, 2010 23:27:30

apologize828
От:
Зарегистрирован: 2010-02-13
Сообщения: 223
Репутация: +  1  -
Профиль   Отправить e-mail  

Логические операции. Оператор идентичности is.

Андрей Светлов
Спасибо огромное за подробное разъяснение!вроде все понял!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version