2015-12-11 5 views
3

Я столкнулся с странным поведением python, сравнивающим строку с True/False.python - сравните строку с boolean

Я думал, что питон будет печатать в следующем:

if "Test" == True: 
    print("Hello1") 

, но это не так. Итак, я написал несколько тестовых примеров, и я не понимаю некоторых из них.

if "Test" == True: 
    print("Hello1") 

if "Test" == False: 
    print("Hello2") 

#This I understand 
if bool("Test") == True: 
    print("Hello3") 

#This I understand too  
if bool("") == False: 
    print("Hello4") 

if "Test": 
    print("Hello5") 

Выход

>> Hello3 
>> Hello4 
>> Hello5 

Так что я не понимаю:

  • Если hello1 не печатается, почему не hello2 либо?
  • Почему Hello5 печатается, является ли бросок для bool («Test») неявным?

ответ

3

В первых двух сравнений, вы проверяете, есть ли строка "Test" такое же значение, как объект True или False. Это сравнение значений.

Если у них другой тип, сравнение вернет False. Вы также можете увидеть это при сравнении списков, номеров и т. Д .: [1]==1 (false), (1,)==[1] (false).

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

Hello5 печатается, потому что это не пустая строка "". Вы можете это увидеть, попробовав "Test" != None, который возвращает True.

Хотя это сравнение None, когда дело доходит до большинства классов (None является нулевое значение в Python), стандартные типы данных Python сравниваются с их «нулевой» величины, которые являются:

  • пустая строка "" для струнных,
  • [] для списков (Similary () для кортежей, {} словарей),
  • 0 для Интс и поплавков,

как раз как булевское сравнение.Поэтому не стоит думать о if expression как неявный листинг в if bool(expression).

Что происходит под капотом - это оценка метода класса __non-zero__ (python2.x) или __bool__ (python3.x).

+0

Если вы улучшите свой ответ, чтобы скрыть сравнение объектов, это на самом деле лучше, чем на user762353. Anwser должен всегда стоять сам по себе. – Altoyyr

+0

обновлен для автономной работы –

+1

@ M.T Первые четыре сравнения: * не * сравнение объектов, а значений. Для сравнения объектов (или, другими словами, идентификаторов) будет '' Test 'is True' not '" Test "== True'. Я думаю, что это то, что вы имеете в виду, но ваша формулировка неоднозначна. Просьба уточнить ваш ответ для будущих пользователей. – eestrada

1

В случае Hello1, Hello2 и Hello5 существует сравнение объектов, а не булево сравнение.

Это означает, что
строка-объект "Test" не такие же, как объект True («hello1»)
объект строки "Test" не такие же, как объект False («hello2»)
но строка объект "Test" не None («Hello5»)

Смежные вопросы