파이썬의 비밀스러운 삶: 그림자 이름
Source: Dev.to
번역을 진행하려면 번역하고자 하는 전체 텍스트(코드 블록이나 URL을 제외한 본문)를 제공해 주세요. 텍스트를 주시면 그대로 한국어로 번역해 드리겠습니다.
Source: …
변수 그림자와 내장 함수 이해하기
Timothy는 화면을 바라보며 눈살을 찌푸렸다.
“Margaret? 이번엔 파이썬을 정말 망가뜨린 것 같아.”
Margaret는 차를 마시며 고개를 들었다.
“그건 대담한 주장이군요, Timothy. 왜 그렇게 생각하나요?”
“
list()함수 때문이에요.” Timothy가 모니터를 가리키며 말했다. “데이터 변환에 천 번은 썼는데, 갑자기 파이썬이 더 이상 동작하지 않는다고 해요. 리스트가 ‘호출할 수 없음(not callable)’이라고 나오더라고요.”
코드상의 문제
# Timothy's script to process customer IDs
# Step 1: Create a list of current IDs
list = [101, 102, 103]
print(f"Current IDs: {list}")
# Step 2: Convert a tuple of new IDs into a list
new_ids_tuple = (201, 202, 203)
processed_ids = list(new_ids_tuple) # “See?” Timothy argued. “I am trying to use `list()` to convert that tuple. But Python says the list object is not callable. Since when can I not call the list function?”
Margaret는 부드럽게 웃었다. “파이썬은 완벽히 작동하고 있어요, Timothy. 문제는 이름표를 빌려왔기 때문이죠.”
LEGB 규칙
Margaret는 화이트보드에 네 글자를 적었다: L.E.G.B.
- Local Scope – 현재 함수 내부
- Enclosing Scope – 중첩 함수들
- Global Scope – 메인 스크립트
- Built‑in Scope – 파이썬 핵심 도구들
“
list,str,max같은 이름은 Built‑in Scope, 즉 도구 상자 가장 아래에 살아 있습니다.
파이썬은 Global Scope에 변수를 만들 수 있게 허용합니다.list = [101, 102, 103]라고 썼을 때, 내장list위에 새로운 라벨list를 올린 것이죠.
그래서 Step 2에서list(new_ids_tuple)을 호출했을 때, 파이썬은 먼저 여러분이 만든 전역 변수를 찾고, 더 이상 찾아보지 않으며, 호출할 수 없는 리스트 객체를 호출하려고 시도합니다.”
변수 그림자(Variable Shadowing)
Timothy는 한숨을 쉬었다. “왜 파이썬이 이런 걸 허용하나요? list라는 단어를 쓰는 걸 금지하면 안 되나요?”
“파이썬은 여러분이 성인이라고 가정하기 때문이에요.” Margaret가 답했다. “고급 사용자는 테스트나 특수 프레임워크를 위해 내장 동작을 재정의해야 할 때가 있습니다. 파이썬은 모든 것을 바꿀 수 있는 권한을 줍니다—때때로 스스로 신발 끈에 걸려 넘어지게 만들기도 하죠.”
“그러니까 저는 도구를 제 변수로 가려버린 거군요.” Timothy가 말했다.
“맞아요. 이것을 Variable Shadowing(변수 그림자) 라고 합니다.”
문제 해결
# Margaret's fix: descriptive naming
# Step 1: Use a descriptive name, not a reserved word
current_ids = [101, 102, 103]
print(f"Current IDs: {current_ids}")
# Step 2: Now `list` still refers to the built‑in function
new_ids_tuple = (201, 202, 203)
processed_ids = list(new_ids_tuple) # Works perfectly!
print(f"Processed: {processed_ids}")
출력
Current IDs: [101, 102, 103]
Processed: [201, 202, 203]
“훨씬 낫네요.” Timothy가 말했다. “
current_ids는 데이터가 무엇인지 알려 주고, 단순히 타입만 알려 주는 것이 아니라는 점이 좋습니다.”
흔히 빠지는 함정
| 함정 | 증상 | 원인 | 해결 방법 |
|---|---|---|---|
list, str, dict, max, id 같은 변수명 사용 | 스크립트 뒤쪽에서 TypeError: 'list' object is not callable | 그림자 현상 – 변수가 내장 참조를 덮어씀 (LEGB) | 변수명을 의미 있는 이름으로 바꾸기 |
| 나쁜 예시 | str = "Hello"max = 10 | 동일한 그림자 문제 | greeting = "Hello"max_score = 10 |
빠른 체크: 코드 편집기에서 변수명이 특수 색(보통 보라색이나 파란색)으로 표시된다면, 내장 함수와 충돌할 가능성이 높으니 이름을 바꿔 보세요.
Timothy는 메모를 남겼다.
“이제 파이썬을 비난하기가 싫어요. 파이썬은 제가 시킨 대로 정확히 행동했거든요.”
Margaret는 미소 지었다.
“대부분 그렇죠. 그것이 바로…”
Source: …
both its greatest strength and its greatest frustration.”
다음 에피소드를 기대해 주세요. 티모시가 문자열 "5"와 숫자 5를 비교할 때 왜 조용히 실패하거나 특정 상황에서는 충돌할 수 있는지 배우게 됩니다.