Можно ли заменить "==" на "is", чтобы сравнить значения Boolean
Я сделал несколько булевых сравнений:
>>> (True or False) is True
True
>>> (True or False) == True
True
Похоже, что ==
и is
взаимозаменяемы для булевых значений.
Иногда более понятно использовать is
Я хочу знать, что:
Предоставлены ли True
и False
в python?
Является ли bool(var)
всегда возвращать те же True
(или False
) с предварительно выделенным True
(или False
)?
Можно ли заменить ==
на is
, чтобы сравнить значения Boolean?
Это не о лучшей практике.
Я просто хочу знать Истину.
Ответы
Ответ 1
Вам, вероятно, никогда не придется сравнивать booleans. Если вы делаете что-то вроде:
if some_bool == True:
...
... просто измените его на:
if some_bool:
...
Нет is
или ==
.
Как отмечают комментаторы, существуют веские причины для сравнения булевых. Если оба булина неизвестны, и вы хотите знать, совпадает ли он с другим, вы должны использовать ==
или !=
, а не is
или is not
(причина объясняется ниже). Обратите внимание, что это логически эквивалентно xnor
и xor
соответственно, которые не существуют как логические операторы в Python.
Внутри всегда должно быть два булевых литерала (см. также API API"), а bool(x) is True
должен быть True
, если bool(x) == True
для любой программы Python. Два оговорки:
- Это не означает, что
x is True
, если x == True
, однако (например, x = 1
).
- Это справедливо для обычной реализации Python (CPython), но может быть неверным в других реализациях. Следовательно,
==
является более надежным сравнением.
Ответ 2
Следите за тем, что еще вы можете сравнить.
>>> 1 == True
True
>>> 1 is True
False
True и False будут иметь стабильные идентификаторы объектов для своего времени жизни в вашем экземпляре python.
>>> id(True)
4296106928
>>> id(True)
4296106928
is
сравнивает идентификатор объекта
EDIT: добавление or
Поскольку OP использует or
, о котором идет речь, может быть полезно указать это.
или который оценивает значение True: возвращает первый объект True.
>>> 1 or True
1
>>> 'a' or True
'a'
>>> True or 1
True
или который оценивает False: возвращает последний объект "False"
>>> False or ''
''
>>> '' or False
False
, и это значение равно True: возвращает последний объект "True"
>>> True and 1
1
>>> 1 and True
True
, и он вычисляет значение False: возвращает первый объект "False"
>>> '' and False
''
>>> False and ''
False
Это важная идиома python и позволяет использовать сжатый и компактный код для работы с логической логикой над обычными объектами python.
>>> bool([])
False
>>> bool([0])
True
>>> bool({})
False
>>> bool({False: False})
True
>>> bool(0)
False
>>> bool(-1)
True
>>> bool('False')
True
>>> bool('')
False
В основном "пустые" объекты False, "non empty" - "True".
Объединяя это с @detly, а другие ответы должны дать некоторое представление о том, как использовать if
и bools в python.
Ответ 3
Да. Есть ровано, чтобы быть ровно двумя bool
s, True и False:
Класс bool не может быть подклассом в дальнейшем. Его единственными экземплярами являются False и True.
Это означает, что если вы знаете, что оба операнда bool
, ==
и is
эквивалентны. Однако, как отмечает detly, обычно нет оснований для использования в этом случае.
Ответ 4
Кажется, что все ответы касаются True
и False
, определенных после запуска интерпретатора. Прежде чем булевы стали частью Python, они часто определялись как часть программы. Даже сейчас (Python 2.6.6) они являются только именами, которые можно указать на разные объекты:
>>> True = 1
>>> (2 > 1)
True
>>> (2 > 1) == True
True
>>> (2 > 1) is True
False
Если вам приходится иметь дело со старым программным обеспечением, имейте это в виду.
Ответ 5
Операторы == для проверки равенства. Это тесты ключевых слов для идентификации объекта. Будем ли мы говорить об одном и том же объекте. Обратите внимание, что больше переменных может относиться к одному и тому же объекту.
Ответ 6
==
и is
- оба оператора сравнения, которые возвращают логическое значение - True
или False
. True имеет числовое значение 1 и False имеет числовое значение 0.
Оператор ==
сравнивает значения двух объектов и объектов, по сравнению с которыми чаще всего являются одни и те же типы (int vs int, float vs float). Если вы сравниваете объекты разных типов, то они неравны. Оператор is
проверяет идентичность объекта, 'x is y' истинно, если оба x и y имеют одинаковый id. То есть, это те же объекты.
Итак, когда вы сравниваете, сравнивая возвращаемые значения одного и того же типа, используйте ==, и если вы сравниваете, если два объекта одинаковы (булевы или что-то еще), вы можете использовать is
.
42 is 42
Верен и совпадает с 42 == 42
.