Вопрос по python – Почему «[] == False» оценивается как False, если «если нет []» успешно?

29

Я спрашиваю об этом, потому что знаю, что питонный способ проверить, является ли список пустым, состоит в следующем:

my_list = []
if not my_list:
    print "computer says no"
else:
    # my_list isn't empty
    print "computer says yes"

распечатаетcomputer says noи т. д. Так что это приводит меня к идентификации[] сFalse истинностные значения; однако, если я попытаюсь сравнить [] и False & quot; непосредственно & quot ;, я получу следующее:

>>> my_list == False
False
>>> my_list is False
False
>>> [] == False
False

так далее...

Что здесь происходит? Я чувствую, что упускаю что-то действительно очевидное.

Это отличный дизайн, поскольку он также заставляет программистов не использоватьif variable == True: пункт. Должно быть либоif variable is True: (Это абсолютно верно, а не что-нибудь еще - в большинстве случаев это не лучший способ сделать что-либо), илиif variable (это правда). Darthfett

Ваш Ответ

4   ответа
3

огическое значение. Попробуй это:

>>> not []
True

>>> not [1]
False

& 'Представл ет собой & Quot; и & quot; == & quot; не делайте этого преобразования.

Error: User Rate Limit ExceedednotError: User Rate Limit Exceeded(not []) == TrueError: User Rate Limit Exceeded(not [1]) == False.
Error: User Rate Limit Exceeded
7

которое позволяет вам проверять их на достоверность. УвидетьПроверка истинности.

Это отличается от того, чтобы сказатьobject == False который делает тест фактического значения (тест на равенство). Это использование объектов__eq__() метод, чтобы определить, равны ли их значения.

Error: User Rate Limit Exceededif object:
Error: User Rate Limit Exceeded
51

if оператор оценивает все в логическом контексте, как будто есть неявный вызовbool() встроенная функция.

Вот как вы бы на самом деле проверяли, как вещи будут оцениватьсяif заявление:

>>> bool([])
False
>>> bool([]) == False
True

Смотрите документацию наПроверка истинностипустые спискиconsidered false, но это не означает, что они эквивалентныFalse.

ОПТОСОЗ 285 также есть отличная информация о том, почему это было реализовано таким образом, см. последний пункт вResolved Issues раздел для части, которая имеет дело сx == True а такжеx == False в частности.

Наиболее убедительным аспектом для меня является то, что== как правило, переходный, такa == b а такжеb == c подразумеваетa == c, Так что, если бы это было так, как вы ожидали, и[] == False были правдой и'' == False правда, можно предположить, что[] == '' должно быть истинным (даже если это явно не должно быть в языке без неявного преобразования типов).

Error: User Rate Limit ExceededJavascript.
14

False in a Boolean context, Это не означает, что они буквально равны константеFalse.

Другими словами, следующееTrue:

bool([]) == False

Истинная ценность объекта определяется его__nonzero__() или его__len__() метод. (В Python 3__nonzero__() был переименован в__bool__().) Контейнеры имеют__len__() метод, поэтому они правдивы, когда в них есть что-то, и ложны, когда они пусты.

Если пустые контейнеры были буквально равныFalseКстати, тогда любой пустой контейнер будет равен любому другому пустому контейнеру: например,{} == "" было быTrue, И это просто не имело бы никакого смысла вообще!

Однако, просто чтобы взорвать, следующееTrue:

False == 0

Это потому, что логические выражения являются подклассом целых чисел в Python, иFalse в основном просто ноль, который печатается немного по-другому.

Похожие вопросы