Форум сайта python.su
Всем привет!
Вот решил еще раз пробежаться по Книге Саммерфилд - Программирование на 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
>>>
#-*- 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 а не False как в IDLE?Поясните пожалуйста, очень хочу разобраться!
True
True
True
Офлайн
Еще один хороший вопрос!
Дело в следующем. В CPython оператор is проверяет, равны ли _адреса объектов_.
В “идеальном Питоне” все ваши проверки на ‘is’ должны вернуть False.
CPython использует механизм кеширования.
Это когда для уже существующего объекта берется он самый, а не создается новый.
Например, пустая строка всегда эквивалентна другой пустой строке - так работает конструктор str('').
Однозначно кешируются еще односимвольные строки латинского алфавита.
То же самое происходит с целыми (и некоторыми рациональными) числами.
Со строчками большей длинны ситуация не столь прозрачна.
Есть довольно сложная эвристика (смотрите unicodeobject.c), определяющая - попадет ли ваша строка в кеш или нет. CPython пытается работать с этим кешем максимально эффективно (и, поверьте, каждое изменение сопровождается тестами и бурными дебатами: ведь работа со строками и словарями составляет значительную часть главного рабочего цикла - ceval.c).
Резюме: нельзя полагаться на ‘is’ при сравнении строк. Они совпадают лишь потому, что сейчас CPython при таком поведении работает чуть-чуть быстрее.
В следующей версии все может кардинально поменяться.
Теперь, собственно, ответ на сам вопрос. IDLE написан на питоне, и ему тоже нужны строки. Кеш заканчивается, и последняя проверка уже не работает - это были два разных объекта. Создайте много-много коротких строчек в консольном скрипте - и вы тоже перешагнете этот порог.
Я понятно ответил, или нужно уточнить что-то еще?
Отредактировано (Июнь 11, 2010 23:09:36)
Офлайн
Андрей СветловСпасибо огромное за подробное разъяснение!вроде все понял!
Офлайн