Python의 비밀스러운 삶: Truthiness와 Falsy Values
Source: Dev.to
객체의 영혼
마가렛은 차를 내려놓았다. “파이썬이 거짓말하는 게 아니야, 티모시. 그냥 아주… 철학적인 거야. 파이썬에게 if 문은 변수가 존재하는지를 묻는 것이 아니라, 그 변수가 **진리성(truthiness)**을 가지고 있는지를 묻는 거지.”
진리성? 티모시가 물었다. “그게 기술적인 용어인가요?”
“파이썬에서는 확실히 그렇다,” 마가렛이 미소 지으며 말했다. “이 언어의 모든 객체는 내부에 ‘참’ 혹은 ‘거짓’이라는 속성을 가지고 있어. if 문을 클럽의 문지기로 생각해 보라. 그는 단순히 이름이 있는지만 확인하지 않아; 파티에 무언가를 가져오는지도 확인한다. 빈 손이라면 Falsy가 된다.”
“Falsy” 명예의 전당
다음과 같이 bool() 함수를 사용해 어떤 객체의 진리성을 테스트할 수 있다:
bool(0) # False
bool(0.0) # False
bool("") # False
bool([]) # False
bool(()) # False
bool({}) # False
bool(None) # False
이 값들이 if 문에 나타나면 False처럼 동작한다.
Note: Falsy 값은 불리언
False와 동일하지 않다.
0 == False는 값이 같기 때문에True로 평가되지만,0 is False는 서로 다른 객체이므로False이다.
거짓된 제로
티모시는 점수를 문자열로 바꾸어 보았다:
score = "0"
if score:
print(f"Current Score: {score}")
else:
print("Welcome! Please play a match to see your score.")
출력
Current Score: 0
빈 문자열이 아닌 어떤 문자열도, "0"조차도 진리성을 가진다. 심지어 한 칸짜리 공백 문자열 bool(" ")도 진리성을 가진다.
정체성 vs. 실체
“문지기”가 제로를 거부하지 않게 하려면, 진리성 대신 정체성을 검사한다:
score = 0
# 'if score' (진리성) 를 묻지 말고
# 'if score is not None' (정체성) 을 물어라
if score is not None:
print(f"Current Score: {score}")
else:
print("Welcome! Please play a match.")
출력
Current Score: 0
is not None을 사용하면 파이썬에게 해당 변수가 메모리 상에 실제 객체를 가리키는지 여부만을 묻는다. 그 객체가 0, False, 혹은 빈 컬렉션이든 관계없다.
마가렛의 요약표: 거짓된 진리
- 진리 감지기:
bool(x)– 파이썬이 객체의 진리성을 어떻게 평가하는지 확인한다. - 단축키 (
if x:): 컬렉션에 아이템이 있거나 문자열에 문자가 있는지만 확인하고 싶을 때 사용한다. - 전문가용 가드 (
if x is not None:):0,False, 빈 컨테이너가 유효한 데이터이며 건너뛰고 싶지 않을 때 사용한다. - 문자열 함정:
"0","False"및" "는 모두 진리성을 가지며, 비어 있지 않기 때문이다.
다음 에피소드에서 마가렛과 티모시는 “복제 고양이”와 마주하게 된다—티모시는 때때로 무언가를 복사하면 원본을 아직도 괴롭히는 유령이 생긴다는 것을 배우게 된다.