В каких случаях переменная в Python воспринимается как булева?
Простая задача: получить что-то на вход (число, слово, не важно что), а затем вывести это.
Если пользователь ничего не ввел - сообщить ему об этом.
Задачу решить с помощью оператора логического сравнения " != ".
Написал скрипт, который работает одинаково в обоих случаях (выводит то, что я ввел или пустоту, если ничего не ввел):
word = input("Напиши хоть что-то: ")
if word != 0:
print("Ты ввел вот это:", word)
else:
print("Ты ничего не ввел. Молодец...")
Вряд ли оператор сравнения в данном случае срабатывает как оператор присваивания, так что пришёл к выводу, что в данном случае переменная не воспринимается компилятором как булева, хотя, как мне известно, любое ненулевое значение переменной приравнивается к True, а нулевое - к False. То есть условие сравнивает переменную с нулем как с числом, и, естественно, если ничего не ввести, то "ничего" != 0. Но, в результате опытов, пришел к следующему скрипту, который работает.
word = input("Напиши хоть что-то: ")
if (not word) != 0:
print("Ты ввел вот это:", word)
else:
print("Ты ничего не ввел. Молодец...")
Итак, вопрос: в каких случаях компилятор интерпретирует переменную как булево значение и сравнивает с логическим нулем, а в каких как переменную и сравнивает её значение с нулем как с числом? Заранее спасибо за ответ)
Ответы (2 шт):
Обратите внимание, что и с чем вы сравниваете. В вашем случае, если вы хотите сравнивать строку с 0, то это не совсем правильно. Тогда сравнивайте длину строки:
word = input('Напиши хоть что-то: ')
if len(word) != 0:
print(f'Ты ввел вот это: {word}')
else:
print(f'Ты ничего не ввел')
Для примера:
print(False == 0)
Вывод:
True
Дело в том, что не "переменная воспринимается как булева", а "выражение, которое проверяет if воспринимается как булево.
Ваш пример:
if word != 0:
Тут строка сравнивается с числом. Это выражение всегда будет истинным, потому что никакая строка не может быть равна числу - это разные типы.
А вот если вы напишете так:
if word:
То для того, чтобы решить, выполнился if или нет, то, что стоит между if и : приводится к типу bool. Если там какое-то сложное выражение, оно разбирается дальше, но суть в том, что преобразование в bool идёт тогда, когда требуется bool значение. Например, если будет что-то такое:
if word and phrase:
То, поскольку оператор and логический, тут уже к bool для проверки начнут приводиться отдельные части этого выражения и всё будет несколько сложнее, потому что там тоже своя хитрая логика у логических операций с не булевскими переменными.
Но в общем, если резюмировать кратко:
if <выражение>: - это тоже самое, что if bool(<выражение>): и именно из-за этого тут происходит приведение к типу bool.