빈 목록인데 파이썬 all 검사가 통과하는 이유

이 카테고리 글 목록

전체글 보기

출고할 항목이 적어도 하나 있고 각 항목의 수량도 양수여야 한다면 두 조건을 따로 검사하세요. 리스트 quantities에는 bool(quantities) and all(qty > 0 for qty in quantities)를 쓸 수 있습니다. all()만 호출하면 검사 대상이 빈 리스트여도 True가 나옵니다.

빈 묶음과 수량이 잘못된 묶음

가상의 출고 수량입니다. 빈 묶음, 수량이 0인 항목이 섞인 묶음, 모든 수량이 양수인 묶음을 비교합니다.

for quantities in ([], [3, 0], [3, 2]):
    all_positive = all(qty > 0 for qty in quantities)
    any_positive = any(qty > 0 for qty in quantities)
    can_ship = bool(quantities) and all(qty > 0 for qty in quantities)
    print(f"{quantities} all={all_positive} any={any_positive} ship={can_ship}")
[] all=True any=False ship=False
[3, 0] all=False any=True ship=False
[3, 2] all=True any=True ship=True

all()은 조건을 어긴 항목을 처음 만나면 False를 반환합니다. 빈 리스트에는 조건을 어긴 항목이 없으므로 True가 됩니다. any()는 조건을 만족한 항목이 하나라도 있어야 True가 되므로 빈 입력에서는 False입니다. [3, 0]도 any()는 통과합니다. 출고 규칙에는 항목의 존재와 모든 수량의 조건 충족이 모두 필요하므로 bool(quantities)와 all()을 묶었습니다.

앞의 bool(quantities)는 리스트가 비었는지 검사합니다. 제너레이터나 iter([]) 같은 이터레이터의 bool() 값으로는 읽을 항목이 남아 있는지 알 수 없습니다. 작은 유한 입력이라면 소비 전에 리스트로 받아 같은 검사를 할 수 있습니다. 한 번만 순회해야 한다면 항목을 하나라도 읽었는지와 조건 위반을 같은 순회에서 확인하세요. 한 번 읽은 제너레이터가 비는 경우에는 읽는 순서가 왜 중요한지 나와 있습니다.

예제는 Windows의 Python 3.14.3에서 실행했습니다. 자세한 동작은 Python의 all 문서와 any 문서에서 확인할 수 있습니다.

이 카테고리의 다른 글

전체글 보기

댓글 남기기