Почему () 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 не будет работают так же, как ==
Если вы пытаетесь сравнить два кортежа по значению, == будет лучшим сравнением.