파이썬의 비밀스러운 삶: 무에 대한 진실

발행: (2025년 12월 23일 오후 01:18 GMT+9)
8 min read
원문: Dev.to

Source: Dev.to

도서관은 조용했으며, 티모시의 펜이 리듬감 있게 긁는 소리만이 들렸다. 그는 화면에 있는 함수를 디버깅하며 메모와 교차 확인하고 있었다.

“마가렛,” 그가 고개를 들어 말했다. “이 가독성을 이제 좀 익히는 것 같아. 내가 만든 체크가 얼마나 명시적인지 봐.”

그는 노트북을 돌려 보였다.

# Timothy's "Explicit" Code
def process_order(items, user_name):
    if len(items) > 0:
        print("Processing items...")

    if user_name != "":
        print(f"User is: {user_name}")

    if items is not None:
        # do something else

“정말… 철저하네,” 티모시가 웃으며 말했다. “나는 모든 것을 검사하고 있어. 리스트 길이가 0보다 큰지 확인하고, 문자열이 비어 있지 않은지 확인하고, 아무것도 우연에 맡기지 않아.”

마가렛은 안경 너머로 바라보며 말했다. “확실히 철저하구나, 티모시. 하지만 파이썬을 무거운 억양으로 말하고 있어.”

그녀는 키보드에 손을 뻗으며 말했다. “파이썬에서는 객체에게 스무 가지 질문을 던지지 않아. 그냥 그들에게 값을 물어볼 뿐이야.”

진리의 “저울”

Margaret는 Timothy의 장황한 검사를 삭제하고 이것으로 교체했습니다:

# Margaret's "Pythonic" Code
def process_order(items, user_name):
    if items:
        print("Processing items...")

    if user_name:
        print(f"User is: {user_name}")

Timothy는 찡그렸다. “잠깐. if items:? 그런데 items는 리스트이고, 불리언이 아니에요. True도 False도 아니에요. 이것은 여러 개의 항목들의 모음이에요.”

“파이썬에서는 모든 객체가 Truthiness를 가집니다. 단순히 불리언 TrueFalse에 관한 것이 아니라 실체에 관한 것입니다.”

그녀는 저울 한쪽에 무거운 책을 올렸다. 저울이 기울었다.

“이 리스트는 항목이 있습니다. 무게가 있습니다. 따라서 Truthy입니다.”

그녀는 책을 제거했고, 저울은 비어 있고 균형을 이루었다.

“이 리스트는 비어 있습니다. 무게가 없습니다. 따라서 Falsy입니다.”

“Whitespace” 함정

Timothy는 천천히 고개를 끄덕였다. “알겠어요. 내용이 있으면 True이고, 비어 있으면 False죠.”

그는 다시 코드를 바라보았다. “그러니까 사용자가 이름에 스페이스만 입력하고—스페이스바만 눌러도—그게 비어 있는 거죠? 그래서 if user_name: 은 False가 되어야 하나요?”

“조심해,” Margaret가 경고했다. “공기에도 무게가 있나요?”

“기술적으로는… 네.”

“공백을 포함한 문자열은 비어 있지 않아,” Margaret가 바로잡았다. “문자 하나, 즉 공백 문자를 포함하고 있어. 따라서 무게가 있는 거야.”

그녀는 간단한 시연을 입력했다:

name = " "  # Just a space

if name:
    print("This name is Truthy!")
else:
    print("This name is Falsy!")

Output

This name is Truthy!

Timothy는 놀란 표정을 지었다. “버그가 될 수도 있겠네요. 빈 이름을 차단하고 싶다면, 이 검사는 통과시켜 버릴 거예요.”

“정확히 그렇습니다,” Margaret가 말했다. “이것은 명시적으로 처리해야 하는 몇 안 되는 경우 중 하나예요. 공백만 있는 ‘내용’이 아닌 실제 문자열을 확인하려면 먼저 공백을 제거해야 합니다: if name.strip():.

The Truthiness Audit

“이거 점점 미끄러워지네,” 티모시가 말했다. “‘아무것도 없음’이 정확히 무엇을 의미하는지 어떻게 알 수 있지?”

“우리는 그것들을 감사해,” 마가렛이 대답했다. “우리는 그것들을 저울에 올려봐.”

그녀는 일반적인 “빈” 값들을 순회하면서 공식적인 불리언 상태를 확인하는 스크립트를 작성했다:

# The Truthiness Audit
suspects = [
    [],         # Empty List
    [1],        # List with item
    "",         # Empty String
    " ",        # String with space
    0,          # Zero
    1,          # Non-zero number
    None,       # The Void
    True,       # Boolean True
    False       # Boolean False
]

print(f"{'OBJECT':<10} | {'TRUTHINESS'}")
print("-" * 25)

for suspect in suspects:
    # The bool() function reveals the truth
    print(f"{repr(suspect):<10} | {bool(suspect)}")

그들은 스크립트를 실행했다. 증거는 부인할 수 없었다.

OBJECT     | TRUTHINESS
-------------------------
[]         | False
[1]        | True
''         | False
' '        | True
0          | False
1          | True
None       | False
True       | True
False      | False

“None”의 함정

None을 보세요,” Margaret가 지적했다. “이는 빈 리스트 []와 마찬가지로 False로 평가됩니다. 하지만 조심하세요. 빈 리스트는 안에 아무것도 없는 상자입니다. None상자 자체가 없다는 것을 의미합니다.”

“상자가 없는지를 정확히 알아야 한다면, 명시적으로 물어야 합니다: if items is None:.”

“하지만 로직의 99 %에서는 상자의 크기를 재거나 아이템 수를 셀 필요가 없습니다. 객체에게 단 하나의 질문만 하면 됩니다: 당신은 중요한가?

그녀가 화면을 탭했다. “게다가 if items:는 길이를 계산하는 것보다 빠릅니다. Timothy, 당신은 단순히 더 깔끔한 코드를 쓰는 것이 아니라, 더 빠른 코드를 쓰고 있는 겁니다.”

마가렛의 치트 시트

진리성: if 문에서 어떤 객체든 사용할 수 있습니다.

  • “Falsy” 클럽

    • False
    • None (비어 있음)
    • 0 또는 0.0
    • 빈 컬렉션: "", [], (), {}
  • “Truthy” 클럽

    • 그 외 모든 것.
  • 공백 트랩

    • " " 은 Truthy! 공백을 무시하려면 if string.strip(): 를 사용하세요.
  • 일반적인 규칙

    • “비어 있거나 0이면 False 입니다. 내용이 있으면 True 입니다.”
Back to Blog

관련 글

더 보기 »