2013-12-22 6 views
8

Из this link я узнал, чтоКак распаковка кортежа отличается от обычного назначения?

Текущая реализация хранит массив целых объектов для всех целых чисел от -5 до 256, при создании Int в этом диапазоне вы на самом деле просто получить назад ссылку на существующий объект

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

Вот фрагмент кода,

Python 2.7.2 (default, Oct 11 2012, 20:14:37) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a,b = 300,300 
>>> a is b 
True 
>>> c = 300 
>>> d = 300 
>>> c is d 
False 
>>> 
+4

Не определено, как '' 'ведет себя за целые числа. Любые знания, которые вы получаете о том, как одна из реализаций ведет себя сегодня, будут хрупкими. –

+1

@Anonymous: «Реализация, определенная» более точна, чем «не определена», но утверждение о хрупкости по-прежнему содержит – Eric

+0

возможный дубликат [Weird Integer Cache внутри Python 2.6] (http://stackoverflow.com/questions/15171695/ странно-целочисленного кэш-внутри-питон-2-6). Не совсем тот же вопрос, но принятый ответ (отказ от ответственности: мой) показывает, что происходит в случае кортежей, которые, я считаю, достаточно, чтобы ответить на ваш вопрос: это так называемый оптимизатор глазок, который позволяет избежать дублирования констант. – Bakuriu

ответ

7

Поскольку int является неизменным, Python может или не может использовать существующий объект, если вы сохраните следующий код в файле сценария и запустите его, он выведет два True.

a, b = 300, 300 
print a is b 

c = 300 
d = 300 
print c is d 

Когда Python скомпилирует код, он может повторно использовать все константы. Старайтесь вводить свой код в сеансе python, коды скомпилированы по строкам, Python не может повторно использовать все константы в качестве одного объекта.

В документе говорится, что будет только один экземпляр для -5 до 256, но не определяет поведение других. Для неизменяемых типов is и is not не важны, потому что вы не можете их модифицировать.

+0

Вы можете смоделировать это в приглашении интерпретатора, поместив весь свой код в одну функцию, а затем запустив его (в отличие от запуска по одному за раз). –

2
import dis 

def testMethod1(): 
    a, b = 300, 300 

print dis.dis(testMethod1) 

Печать:

4 0 LOAD_CONST 2 ((300, 300))
3 UNPACK_SEQUENCE 2
6 STORE_FAST 0 (а)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (отсутствует)
15 return_value Отсутствует

def testMethod2(): 
    a = 300 
    b = 300 

Печать:

7 0 LOAD_CONST 1 (300)
3 STORE_FAST 0 (а)
6 LOAD_CONST 1 (300)
9 STORE_FAST 1 (b)
12 LOAD_CONST 0 (Нет)
15 return_value Ни

Таким образом, это выглядит, по существу то же самое, но с LOAD_CONST в одну стадию в первом способе и два этапа во втором методе ....

РЕДАКТИРОВАТЬ
После некоторого тестирования я обнаружил, что оба метода возвращают False; однако, только на одном запуске, т. е. не помещая методы в цикл, они, похоже, всегда возвращают True. Иногда он использует одну ссылку, а иногда и нет.

В документации только указано, что от -5 до 256 вернет ту же ссылку; следовательно, вы просто не должны использовать is для сравнения (в данном случае), поскольку текущий номер id не имеет на это гарантии.

NB: Вы не хотите использовать is для сравнения значений, так как это не то, для чего нужно, это сравнить идентификаторы. Моя точка зрения заключалась в том, что возвращаемое значение is не всегда будет True, когда вы находитесь за пределами заданного диапазона.

+0

Привет, Стив П, я тестировал в osx, python 2.7.2 –

+0

Это зависит от реализации Python. Загрузка в два этапа дает больше времени для освобождения кеш-памяти низкого уровня. Кэш [-5, 256] происходит в коде Python, но объекты, подлежащие повторному использованию (например, int), могут быть повторно использованы. Вы не можете доверять этим кешам. – iurisilvio

+1

По поводу вашего последнего абзаца 'is' не используется для сравнения. 'is' следует использовать для« идентичности ». Сравнение a и b похоже на высказывание «равно b». Тестирование идентичности похоже на высказывание: «a и b то же самое» –

Смежные вопросы