Начинающие разработчики часто встречают такой код в условных операторах:

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

На изображении видно, что мужчина слева держит облачко речи, но ничего не говорит — это соответствует пустой строке "".
Женщина справа даже не имеет облачка — это None.

Оба они оцениваются как False в следующих условиях:

male_voice = ""
female_voice = None

if not male_voice and not female_voice:
    print("Ничего не говорит!")  # оба False, выполняется

Как же различать их на практике?

Например, взглянем на обработку пользовательского ввода:

username = user_input.get("username", None)
  1. Если пользователь ничего не ввёл → None
  2. Если пользователь ввёл пустую строку → ""

Хотите обработать их по-разному?

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 и ==!