Найти - Пользователи
Полная версия: Логические операции. Оператор идентичности is.
Начало » Python для новичков » Логические операции. Оператор идентичности is.
1
apologize828
Всем привет!
Вот решил еще раз пробежаться по Книге Саммерфилд - Программирование на 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……….
Андрей Светлов
Еще один хороший вопрос!

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

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

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


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

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

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

Я понятно ответил, или нужно уточнить что-то еще?
apologize828
Андрей Светлов
Спасибо огромное за подробное разъяснение!вроде все понял!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB