파이썬의 비밀스러운 삶: 그림자 이름

발행: (2026년 2월 4일 오전 11:44 GMT+9)
6 분 소요
원문: Dev.to

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, print, 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를 비교할 때 왜 조용히 실패하거나 특정 상황에서는 충돌할 수 있는지 배우게 됩니다.

Back to Blog

관련 글

더 보기 »

파이썬의 비밀스러운 삶: 팬텀 복제

Why =는 Python에서 실제로 데이터를 복사하지 않습니다. 티모시가 화면을 응시하며 얼굴이 창백해졌습니다. “마가렛? 데이터베이스 절반을 실수로 삭제한 것 같아.”

기타 자료 구조

튜플 (tuple) – 여러 값을 소괄호로 묶어서 표현합니다. 리스트와 동일하지만 변경이 불가능해 추가·삭제·수정이 X입니다. 사전 (dict) – 열쇠와 값이 짝을 이루는 형태의 자료 구조이며, 순서보다 열쇠가 중요한 경우에 사용합니다. 중괄호 {} 로 표현합니다. python의 .get 메서드를 사용하면 없는 키의 경우…

리스트 주요 메서드

값에 소속된 형태의 함수 - xs.append(y): 리스트 xs의 끝에 값 y를 추가 - xs.extend(ys): 리스트 xs에 리스트 ys의 값들을 추가 (= 덧셈 연산) - xs.insert(idx, y): 리스트 xs의 위치 idx에 값 y를 추가 - xs.remove(y): 리스트 xs에서 y를 제거

리스트

슬라이싱을 사용하면 리스트에서 연속적인 특정 범위를 선택할 수 있습니다. - x[1:3] : x의 1번 인덱스부터 3번 전까지 - x[:2] : x의 시작부터 2번 전까지 - x[1:] : x의 1번 인덱스부터 끝까지 - x[:] : x의 모든 값을 반환 Step(증가값)을 지정하면 슬라이싱 시 간격을 조정할 수 있습니다. - x[::step] …