Начинающие разработчики часто встречают такой код в условных операторах:
if value:
print("Значение существует!")
Сначала может быть трудно понять, что именно проверяет такая простая конструкция if value:
.
Особенно вот эти два:
None
""
(пустая строка)
Оба они оцениваются как False
, поэтому может показаться, что они равны.
Но так ли это на самом деле?
Значения, оцениваемые как Falsy
В Python следующие значения оцениваются как False в условных операторах:
None
False
0
,0.0
""
(пустая строка)[]
(пустой список){}
(пустой словарь)set()
,()
и другие пустые коллекции
Итак, if not value:
охватывает все эти случаи.
None
и ""
различаются
Они выглядят по-разному и ведут себя по-разному.
value1 = None
value2 = ""
print(value1 == value2) # False
print(value1 is value2) # False
print(bool(value1)) # False
print(bool(value2)) # False
==
— это сравнение значений, аis
— сравнение идентичности.None
— это специальный объект, означающий «значения нет»,""
— это строка, но пустая.
На изображении видно, что мужчина слева держит облачко речи, но ничего не говорит — это соответствует пустой строке ""
.
Женщина справа даже не имеет облачка — это None
.
Оба они оцениваются как False
в следующих условиях:
male_voice = ""
female_voice = None
if not male_voice and not female_voice:
print("Ничего не говорит!") # оба False, выполняется
Как же различать их на практике?
Например, взглянем на обработку пользовательского ввода:
username = user_input.get("username", None)
- Если пользователь ничего не ввёл →
None
- Если пользователь ввёл пустую строку →
""
Хотите обработать их по-разному?
if username is None:
print("Ввод отсутствует!")
elif username == "":
print("Введена пустая строка.")
else:
print("Введённое значение:", username)
Распространённые ошибки в практической работе
Следующий код иногда случайно фильтрует все Falsy значения:
if not username:
print("Нет ввода")
Но это условие включает не только пустую строку, но и None
, 0
, пустой список и другие.
Поэтому важно чётко определить намерение:
- Если значение пустое, но оно должно быть строкой →
if username is None:
- Если строка должна существовать, но быть пустой →
if username != "":
- Просто ничего не должно быть →
if not username:
В заключение
None
и ""
не равны. Но оба ведут себя как False
.
Зная эту разницу, вы сможете добиться большей ясности и уменьшить количество ошибок в вашем коде.
В следующем посте мы подробнее рассмотрим такие другие значения, как 0
, []
, {}
и разницу между is
и ==
!
댓글이 없습니다.