В каких случаях переменная в Python воспринимается как булева?

Простая задача: получить что-то на вход (число, слово, не важно что), а затем вывести это.

Если пользователь ничего не ввел - сообщить ему об этом.

Задачу решить с помощью оператора логического сравнения " != ".

Написал скрипт, который работает одинаково в обоих случаях (выводит то, что я ввел или пустоту, если ничего не ввел):

word = input("Напиши хоть что-то: ")
if  word != 0:
    print("Ты ввел вот это:", word)
else:  
    print("Ты ничего не ввел. Молодец...")  

Вряд ли оператор сравнения в данном случае срабатывает как оператор присваивания, так что пришёл к выводу, что в данном случае переменная не воспринимается компилятором как булева, хотя, как мне известно, любое ненулевое значение переменной приравнивается к True, а нулевое - к False. То есть условие сравнивает переменную с нулем как с числом, и, естественно, если ничего не ввести, то "ничего" != 0. Но, в результате опытов, пришел к следующему скрипту, который работает.

word = input("Напиши хоть что-то: ")
if  (not word) != 0:
    print("Ты ввел вот это:", word)
else:  
    print("Ты ничего не ввел. Молодец...")

Итак, вопрос: в каких случаях компилятор интерпретирует переменную как булево значение и сравнивает с логическим нулем, а в каких как переменную и сравнивает её значение с нулем как с числом? Заранее спасибо за ответ)


Ответы (2 шт):

Автор решения: Johan

Обратите внимание, что и с чем вы сравниваете. В вашем случае, если вы хотите сравнивать строку с 0, то это не совсем правильно. Тогда сравнивайте длину строки:

word = input('Напиши хоть что-то: ')
if len(word) != 0:
    print(f'Ты ввел вот это: {word}')
else:
    print(f'Ты ничего не ввел')

Для примера:

print(False == 0)

Вывод:
True

→ Ссылка
Автор решения: CrazyElf

Дело в том, что не "переменная воспринимается как булева", а "выражение, которое проверяет if воспринимается как булево.

Ваш пример:

if  word != 0:

Тут строка сравнивается с числом. Это выражение всегда будет истинным, потому что никакая строка не может быть равна числу - это разные типы.
А вот если вы напишете так:

if word:

То для того, чтобы решить, выполнился if или нет, то, что стоит между if и : приводится к типу bool. Если там какое-то сложное выражение, оно разбирается дальше, но суть в том, что преобразование в bool идёт тогда, когда требуется bool значение. Например, если будет что-то такое:

if word and phrase:

То, поскольку оператор and логический, тут уже к bool для проверки начнут приводиться отдельные части этого выражения и всё будет несколько сложнее, потому что там тоже своя хитрая логика у логических операций с не булевскими переменными.

Но в общем, если резюмировать кратко:
if <выражение>: - это тоже самое, что if bool(<выражение>): и именно из-за этого тут происходит приведение к типу bool.

→ Ссылка