Понимание истинности строк Python

Я понимаю, что встроенные типы Python имеют значение "истинность", и считается пустой строкой Falseв то время как любая непустая строка считается True,

Это имеет смысл

Я могу проверить это с помощью встроенной функции bool,

>>> bool("")
False

>>> bool("dog")
True

Я также могу использовать эти значения истинности при использовании условных выражений. Например:

>>> if "dog":
...     print("yes")
...
yes

Это смущает

Это не работает с == оператор хотя:

>>> "dog" == True
False

>>> "dog" == False
False

Может кто-нибудь объяснить, почему == кажется, действует не так, как условно?

3 ответа

Решение

See the truth value testing and comparisons sections of the documentation, excerpted below.

In a nutshell, most things are truthy by default, which is why bool("dog") правда. == operator compares two objects for equality, as opposed to comparing their truthinesses, as I assume you had expected.

4.1. Truth Value Testing

Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below.

By default, an object is considered true unless its class defines either a __bool__() method that returns False or a __len__() method that returns zero, when called with the object.

Here are most of the built-in objects considered false:

  • constants defined to be false: None а также False
  • zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • empty sequences and collections: '', (), [], {}, set(), range(0)

Операции и встроенные функции, которые имеют логический результат, всегда возвращают 0 или False для false и 1 или True для true, если не указано иное. (Важное исключение: логические операции or а также and всегда возвращайте один из своих операндов.)

4,3. Сравнения

Objects of different types, except different numeric types, never compare equal.

...

Non-identical instances of a class normally compare as non-equal unless the class defines the __eq__() метод.

Основы

Я полагаю, что ваша путаница может возникнуть из-за сравнения Python с такими языками, как JavaScript, где есть == и === оператор. Python не работает таким образом.

В Python единственный способ сравнить на равенство == и это сравнивает как значение, так и тип.

Таким образом, если вы сравните True == "dog"тогда выражение сразу False потому что типы bool а также str не типы, которые можно сравнить.

Хотя, обратите внимание, что это не значит, что нет типов, которые были бы сопоставимы между собой. Примеры set а также frozenset:

frozenset({1,2,3}) == {1,2,3} # True

Или просто int а также float

1 == 1.0 # True

Это поведение для большинства встроенных типов.

Классная часть

В случае, когда вы определяете свои собственные типы, т.е. когда вы определяете классы, вы можете написать __eq__ который вызывается при сравнении объекта класса с другим значением.

Например, вы могли бы сделать это (что, кстати, было отмечено как ужасная идея в комментариях, вы не должны наследовать встроенные типы).

class WeirdString(str):
    def __eq__(self, other):
        return str(self) == str(other) or bool(self) == bool(other)

s = WeirdString("dog")
s == True # True

В случае, если вы не определите __eq__затем Python возвращается к сравнению того же объекта с is,

Когда вы сравниваете "dog" == True Вы также сравниваете тип этих объектов, а не только их логическое значение.

Сейчас как True имеет тип bool а также "dog" имеет тип str они не эквивалентны в соответствии с == оператор, независимо от того, что их логические значения равны.

Примечание. Здесь проверяются как тип объекта, так и логические значения.

Другие вопросы по тегам