초보 개발자일수록 조건문에서 이런 코드를 자주 보게 됩니다:

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정체성(id) 비교입니다.
  • None"아직 값이 없다"는 의미를 가지는 특수한 객체이고,
  • ""문자열이긴 한데 비어 있는 것입니다.

Empty vs None speech bubble comparison

위 이미지를 보면, 왼쪽의 남성은 말풍선을 들고 있지만 아무 말도 하지 않습니다 — 이것은 빈 문자열 ""에 해당합니다.
오른쪽의 여성은 말풍선조차 없습니다 — 이것은 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, [], {} 같은 다른 Falsy 값들과 is==의 차이를 더 깊게 다뤄볼게요!