파이썬 진리값 테스트란?
파이썬에서는 if 문이나 while 문에 조건을 넣어 어떤 객체든 진리값(truth value)을 테스트할 수 있습니다. 조건문 안에서 객체가 참인지 거짓인지 자동으로 판별되기 때문에, 별도의 비교 연산 없이도 간결하고 직관적인 코드를 작성할 수 있습니다.
객체가 속한 클래스에 __bool__() 메서드가 정의되어 False를 반환하거나, __len__() 메서드가 0을 반환하는 경우를 제외하면 해당 객체의 진리값은 기본적으로 True로 간주됩니다.
진리값 판정 규칙
상수 중에서는 False와 None만 거짓(False)으로 평가됩니다.
변수에 담긴 값이 0, 0.0, Fraction(0, 1), Decimal(0), 0j처럼 수학적으로 '영'에 해당하면 거짓(False)으로 평가됩니다.
빈 시퀀스나 빈 컬렉션, 즉 '', [], (), {}, set(), range(0) 등은 모두 진리값이 False입니다.
숫자 관점에서 보면 0은 False와, 1은 True와 동일하게 취급됩니다.
예제 코드
class A: # A 클래스에는 __bool__ 메서드가 없으므로 기본값인 True로 평가됩니다.
def __init__(self):
print('A 클래스입니다')
a_obj = A()
if a_obj:
print('참(True)입니다')
else:
print('거짓(False)입니다')
class B: # B 클래스는 __bool__ 메서드를 정의하여 False를 반환합니다.
def __init__(self):
print('B 클래스입니다')
def __bool__(self):
return False
b_obj = B()
if b_obj:
print('참(True)입니다')
else:
print('거짓(False)입니다')
myList = [] # 요소가 없으므로 False를 반환합니다.
if myList:
print('요소가 있습니다')
else:
print('요소가 없습니다')
myTuple = (10, 47, 84, 15) # 요소가 있으므로 True를 반환합니다.
if myTuple:
print('요소가 있습니다')
else:
print('요소가 없습니다')실행 결과
A 클래스입니다 참(True)입니다 B 클래스입니다 거짓(False)입니다 요소가 없습니다 요소가 있습니다
핵심 정리
위 예제에서 볼 수 있듯이, __bool__ 메서드를 직접 정의하지 않은 클래스의 인스턴스는 항상 참(True)으로 평가됩니다. 반면 __bool__ 메서드가 False를 반환하도록 정의된 클래스의 인스턴스는 거짓(False)으로 평가됩니다.
또한 리스트나 튜플 같은 컬렉션 객체는 내부에 요소가 있는지 여부에 따라 진리값이 결정됩니다. 이러한 특성 덕분에 if not myList:처럼 요소의 존재 여부를 간단하게 확인할 수 있으며, 이는 파이썬에서 널리 사용되는 관용구(idiom)이기도 합니다.