초보 개발자일수록 조건문에서 이런 코드를 자주 보게 됩니다:
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
은 "아직 값이 없다"는 의미를 가지는 특수한 객체이고,""
는 문자열이긴 한데 비어 있는 것입니다.
위 이미지를 보면, 왼쪽의 남성은 말풍선을 들고 있지만 아무 말도 하지 않습니다 — 이것은 빈 문자열 ""
에 해당합니다.
오른쪽의 여성은 말풍선조차 없습니다 — 이것은 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
, []
, {}
같은 다른 Falsy 값들과 is
와 ==
의 차이를 더 깊게 다뤄볼게요!
Add a New Comment