Подтвердить что ты не робот

Оператор Python "есть" и кортежи

Почему () is () true, но (0,) is (0,) - false?

Я думал, что они будут одним и тем же объектом. Тем не менее, я, очевидно, что-то пропустил.

4b9b3361

Ответ 1

is проверьте, имеют ли обе стороны оператора общий адрес памяти. Это в основном сокращение для id(a) == id(b)

>>> print id(()), id(())
30085168 30085168
>>> print id((0,)), id((0,))
38560624 38676432
>>>

Поскольку () происходит довольно часто, он фактически обрабатывается как один синтаксис интерпретатором Python (точно так же, как целые числа от 0 до 255, пустые строки, пустые списки и т.д.). При сравнении (0, ) to (0, ) с интерпретатором они фактически являются разными переменными в памяти. Если бы они были изменчивыми, вы могли бы изменить первый, а второй не изменился бы, поэтому они не совпадают (a is not b).

Ответ 2

is проверяет идентичность, а не равенство. Это означает, что Python просто сравнивает адрес памяти, в котором находится объект. В основном отвечает на вопрос "Есть ли у меня два имени для одного и того же объекта?"

Обычно Python записывает каждый кортеж в другое место памяти,
interning будет в основном происходить только для строковых литералов.

Ответ 3

Как говорит Дугал в своем комментарии, is проверяет, что две вещи, которые вы сравниваете, находятся в одном и том же месте в памяти. Для таких вещей, как числа, строки, булевы и пустые кортежи, Python повторно использует объекты по умолчанию (интернирование), поэтому is часто производит такое же поведение, как ==. Это также означает, что вы можете получить некоторый прирост производительности за счет сравнения указателей памяти, а не более сложных типов данных, таких как строки.

Для других вещей, таких как кортеж в вашем случае (хотя они неизменяемы) или списки и даже пустой список [], Python создаст новый объект в другом месте памяти, а is не будет работают так же, как ==

Если вы пытаетесь сравнить два кортежа по значению, == будет лучшим сравнением.