Почему () is ()
true, но (0,) is (0,)
- false?
Я думал, что они будут одним и тем же объектом. Тем не менее, я, очевидно, что-то пропустил.
Почему () is ()
true, но (0,) is (0,)
- false?
Я думал, что они будут одним и тем же объектом. Тем не менее, я, очевидно, что-то пропустил.
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
).
is
проверяет идентичность, а не равенство. Это означает, что Python просто сравнивает адрес памяти, в котором находится объект. В основном отвечает на вопрос "Есть ли у меня два имени для одного и того же объекта?"
Обычно Python записывает каждый кортеж в другое место памяти,
interning будет в основном происходить только для строковых литералов.
Как говорит Дугал в своем комментарии, is
проверяет, что две вещи, которые вы сравниваете, находятся в одном и том же месте в памяти. Для таких вещей, как числа, строки, булевы и пустые кортежи, Python повторно использует объекты по умолчанию (интернирование), поэтому is
часто производит такое же поведение, как ==
. Это также означает, что вы можете получить некоторый прирост производительности за счет сравнения указателей памяти, а не более сложных типов данных, таких как строки.
Для других вещей, таких как кортеж в вашем случае (хотя они неизменяемы) или списки и даже пустой список []
, Python создаст новый объект в другом месте памяти, а is
не будет работают так же, как ==
Если вы пытаетесь сравнить два кортежа по значению, ==
будет лучшим сравнением.