Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 3, 2018 16:58:25

Vjatcheslav
Зарегистрирован: 2018-09-03
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Как понять поведение питона при выполнении следующего кода

Python 3.4 or 3.6

 k = tuple(a for a in ())
r = tuple()
k is ()  # False. Unbelivable. Please help me to understand this "False".
r is ()  # True
type(k) is type(r)  # True
k == () == r   # True


С чего начать, чтобы понять первый фолс? Как разобраться?

Отредактировано Vjatcheslav (Сен. 3, 2018 17:39:26)

Офлайн

#2 Сен. 3, 2018 18:04:29

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как понять поведение питона при выполнении следующего кода

Кратко: Это оптимизация интерпретатора.
Подробно: Эти объекты равны по содержанию (оператор ==), но не являются идентичным объектом (оператор is)

 >>> id(())
4524154952
>>> id(())
4524154952
>>> id(tuple(a for a in ()))
4527142808
>>> id(tuple(a for a in ()))
4527142760
>>> id(tuple(a for a in ()))
4527142808
Для неизменяемых типов данных интерпретатор кеширует некоторые значения, для оптимизации выполнения. Аналогичным примером служат некоторый ряд чисел
>>> id(-100)
4527149936
>>> id(-100)
4527150192
>>> id(-1)
4523588912
>>> id(-1)
4523588912
значение выражения tuple() также закэшировано. Однако выражение tuple(a for a in ()) это совсем другое выражение, которое порождает новый объект. Несмотря на то что это тоже пустой кортеж, он не является тем же самым объектом.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version