파이썬 들여쓰기 오류 (IndentationError · TabError) 원인과 해결
다른 언어를 쓰다 파이썬으로 넘어온 사람이 거의 반드시 한 번은 겪는 벽이 있다. 코드는 분명히 멀쩡해 보이는데 실행하면 IndentationError나 TabError가 뜬다. 화면에는 아무 이상이 없다. 세미콜론을 빠뜨린 것도, 괄호가 안 맞는 것도 아니다. 범인은 눈에 보이지 않는 공백, 그러니까 탭과 스페이스다. 파이썬에서 들여쓰기는 "보기 좋으라고 하는 것"이 아니라 문법 그 자체이기 때문에, 이 공백 하나가 어긋나면 코드가 통째로 멈춘다. 이 글은 파이썬이 왜 유독 공백에 예민한지부터 시작해, 두 에러의 차이, 메시지별 정확한 해석, 그리고 에디터에서 이 문제를 뿌리째 없애는 방법까지 정리한다.

먼저 마음을 놓아도 되는 사실 하나. 이 에러들은 로직 버그가 아니라 거의 전부 "형식"의 문제라, 원인만 알면 몇 초 안에 고쳐진다. 그리고 한 번 에디터를 제대로 세팅해 두면 다시는 안 만나게 만들 수 있다.
이 글의 흐름
🧠 파이썬은 왜 공백에 예민할까
C, 자바, 자바스크립트를 떠올려 보자. 이 언어들은 코드 블록을 중괄호로 묶는다. if 문 뒤에 여는 중괄호가 오고, 그 안의 내용을 담고, 닫는 중괄호로 끝난다. 이 언어들에게 들여쓰기는 사람 눈에 보기 좋으라고 하는 장식일 뿐, 문법적으로는 아무 의미가 없다. 한 줄에 다 붙여 써도 똑같이 돌아간다.
파이썬은 이 중괄호를 없앴다. 대신 들여쓰기 자체로 블록의 시작과 끝을 판단한다. 같은 깊이로 들여쓰인 줄들이 하나의 블록이고, 들여쓰기가 깊어지면 새 하위 블록이 열리며, 다시 얕아지면 블록이 닫힌다. 이 규칙을 흔히 "오프사이드 규칙(off-side rule)"이라 부른다. 파이썬을 만든 귀도 반 로섬은, 어차피 다들 들여쓰기를 하니 그 들여쓰기를 문법으로 삼으면 누구 코드든 일관되게 읽힌다는 철학으로 이 설계를 택했다.
한 줄 요약
다른 언어에서 중괄호가 하던 일을, 파이썬에서는 들여쓰기가 한다. 그래서 들여쓰기가 어긋나는 것은 다른 언어로 치면 중괄호가 짝이 안 맞는 것과 같은, 명백한 문법 오류다. IndentationError와 TabError는 바로 이 "블록 경계"가 흐트러졌다는 신고다.
이 사실을 받아들이면 두 에러가 왜 나는지가 자연스럽게 풀린다. 파이썬 인터프리터는 코드를 읽을 때, 각 줄이 앞에 몇 칸의 공백을 두고 시작하는지를 세어 블록 구조를 만든다. 이 계산이 어긋나면, 즉 열려야 할 블록이 안 열리거나, 닫을 자리가 애매하거나, 같은 블록인데 들여쓰기 폭이 제각각이면 그 자리에서 멈추고 에러를 던진다. 참고로 IndentationError는 문법 오류의 한 종류(SyntaxError의 하위 클래스)라, "실행 중" 터지는 게 아니라 코드를 해석하는 단계에서 걸러진다.
🎭 두 얼굴 — IndentationError와 TabError
들여쓰기 관련 에러는 크게 둘로 갈린다. 이름이 비슷해 헷갈리지만 원인이 다르다.
| 구분 | IndentationError | TabError |
|---|---|---|
| 무엇이 문제 | 들여쓰기의 양·위치가 어긋남 | 탭과 스페이스를 섞어 씀 |
| 대표 상황 | 콜론 뒤 안 들여씀, 이유 없이 들여씀 | 한 줄은 탭, 다른 줄은 스페이스 |
| 눈에 보이나 | 보통 보임(줄이 튀어나옴) | 거의 안 보임(탭·스페이스 동일 폭) |
| 공식 분류 | SyntaxError의 하위 클래스 | IndentationError의 하위 클래스 |
핵심 감별법은 이렇다. 코드를 봤을 때 한 줄이 눈에 띄게 튀어나오거나 들어가 있으면 IndentationError 쪽이고, 아무리 봐도 다 똑같이 정렬돼 보이는데 에러가 나면 TabError를 의심한다. 후자는 탭 한 칸과 스페이스 여러 칸이 화면상 같은 너비로 보여서, 사람 눈으로는 구분이 안 되기 때문이다.
🔍 메시지별로 정확히 읽기
파이썬은 들여쓰기 문제를 몇 가지 서로 다른 문장으로 알려 준다. 문구마다 원인이 다르니, 메시지를 정확히 읽는 것이 곧 진단이다. 참고로 파이썬 3.10부터 이 메시지들이 한결 친절해져서, 어떤 구문 다음이 문제인지까지 짚어 준다.
# ① 콜론 뒤에 몸통을 안 들여씀
def greet():
print("안녕") # 들여쓰기가 없다
# IndentationError: expected an indented block
# after function definition on line 1
가장 흔한 첫 번째다. def·if·for·while·class 등 콜론으로 끝나는 줄 다음에는 반드시 한 단계 들여쓴 몸통이 와야 한다. 그런데 몸통을 같은 높이에 두면 "들여쓴 블록이 올 차례인데 없다"며 멈춘다. 해결은 몸통을 4칸 들여쓰는 것. 아직 내용을 안 정했다면 pass 한 줄이라도 넣어 블록을 채운다.
# ② 이유 없이 한 줄을 들여씀
name = "김코딩"
print(name) # 앞에 이유 없는 공백 4칸
# IndentationError: unexpected indent
두 번째는 반대 상황이다. 블록을 열 이유가 없는 줄을 괜히 들여썼다. 위 코드에서 print는 name과 같은 높이(들여쓰기 없음)에 있어야 하는데 앞에 공백이 붙었다. 복사·붙여넣기를 하다 앞 공백이 딸려 오거나, 편집 중 실수로 들여쓸 때 잘 난다. 해결은 그 줄 앞의 불필요한 공백을 지우는 것.
# ③ 닫는 깊이가 어느 단계와도 안 맞음
def f():
if True:
a = 1
b = 2 # 5칸 — 4칸도 8칸도 아닌 애매한 깊이
# IndentationError: unindent does not match
# any outer indentation level
세 번째가 가장 헷갈린다. 블록을 빠져나올(unindent) 때는 이미 존재하던 바깥 단계 중 하나로 정확히 돌아가야 한다. 그런데 b = 2가 5칸이라, 안쪽(8칸)도 아니고 바깥(4칸)도 아닌 어중간한 자리에 놓였다. 파이썬은 "이 줄이 어느 블록으로 돌아가려는 건지 모르겠다"며 멈춘다. 대개 탭과 스페이스가 섞였거나, 들여쓰기 폭을 중간에 바꿨을 때 난다.
# ④ 탭과 스페이스를 섞음
def f():
x = 1 # 이 줄은 스페이스 4칸
y = 2 # 이 줄은 탭 1개 (화면상 같아 보임)
# TabError: inconsistent use of tabs and
# spaces in indentation
네 번째가 TabError다. x는 스페이스로, y는 탭으로 들여썼는데 화면에서는 둘 다 똑같이 정렬돼 보인다. 파이썬 3는 이렇게 탭과 스페이스가 섞여 폭을 확정할 수 없으면 아예 에러로 막는다. 눈으로는 절대 못 잡으니, 뒤에서 볼 "공백 표시" 기능으로 봐야 한다.
⚔️ 탭과 스페이스, 눈에 안 보이는 전쟁
왜 파이썬 3는 탭과 스페이스 섞는 걸 이렇게까지 싫어할까. 문제는 탭의 너비가 정해져 있지 않다는 데 있다. 어떤 편집기는 탭을 4칸으로, 어떤 편집기는 8칸으로 보여 준다. 그래서 탭과 스페이스를 섞으면, 같은 파일이 편집기에 따라 완전히 다른 들여쓰기로 보이고, 파이썬이 블록 구조를 확정할 수 없게 된다. 파이썬 2는 탭을 8칸으로 가정하고 대충 넘어가기도 했지만, 그게 숨은 버그의 온상이라 파이썬 3는 애매하면 무조건 TabError로 막도록 바꿨다.
여기서 흔히 나오는 잘못된 처방들을 짚고 넘어가자. 원인을 덮기만 하고 재발하는 방법들이다.
✗ 문제 줄만 지웠다 다시 침
에러 난 줄만 고치면 그 줄은 넘어가지만, 파일 곳곳에 탭·스페이스가 섞여 있으면 다음 줄에서 또 난다. 한 줄이 아니라 파일 전체의 들여쓰기를 통일해야 한다.
✗ 탭으로 통일하면 되겠지
탭으로만 맞춰도 파이썬은 돌아간다. 하지만 파이썬 표준 스타일 가이드(PEP 8)는 스페이스 4칸을 권장한다. 협업·오픈소스에서 탭은 편집기마다 폭이 달라 갈등을 부르므로, 스페이스 4칸으로 통일하는 게 사실상의 표준이다.
✗ 눈으로 열심히 세서 맞춤
탭과 스페이스는 화면에서 구분이 안 되니, 눈으로는 아무리 봐도 못 잡는다. 이건 사람이 아니라 에디터에게 시켜야 하는 일이다. 아래 세팅이 답이다.
🛠 다시는 안 만나게 — 에디터 세팅
이 에러의 진짜 해결은 "지금 이 줄 고치기"가 아니라 "앞으로 안 생기게 만들기"다. 편집기를 한 번만 제대로 잡아 두면 탭·스페이스 문제는 거의 사라진다.
VS Code 기준 필수 세팅 4가지
이미 탭·스페이스가 뒤섞인 파일이라면, 위 04번(전체 스페이스로 변환)이 가장 확실하다. 명령 하나로 파일 전체의 탭을 스페이스로 바꿔 주니, 한 줄씩 고칠 필요가 없다. 다른 편집기도 이름만 다를 뿐 "탭을 스페이스로 삽입", "공백 문자 표시", "탭을 스페이스로 변환" 세 기능은 대부분 있다.
명령줄에서 미리 검사하는 방법도 있다. 파이썬에 기본 포함된 tabnanny 모듈을 쓰면, 실행하기 전에 탭·스페이스가 애매하게 섞인 지점을 찾아 알려 준다. (참고로 파이썬 3는 이런 혼용을 실행 시 어차피 TabError로 막지만, tabnanny는 그 전에 어느 줄이 문제인지 미리 짚어 주는 용도다. 예전 파이썬 2에서 쓰던 -tt 옵션은 파이썬 3에서는 이미 기본이 엄격해서 필요 없다.) 그리고 코드를 자동으로 표준 형식에 맞춰 주는 도구를 쓰면 아예 손댈 일이 없어진다.
# 탭·스페이스 혼용을 실행 전에 검사 (표준 모듈)
$ python -m tabnanny script.py
# 자동 포맷터로 들여쓰기까지 표준에 맞춰 정리
$ pip install black
$ black script.py # 스페이스 4칸으로 통일 + 전체 정렬
black 같은 자동 포맷터를 붙여 두면, 저장할 때마다 들여쓰기가 표준으로 정리돼 IndentationError·TabError를 사실상 원천 봉쇄할 수 있다.
🧭 증상으로 바로 찾기
| 에러 메시지 | 진짜 원인 | 해결 |
|---|---|---|
| expected an indented block | 콜론 뒤 몸통을 안 들여씀 | 몸통 4칸 들여쓰기(또는 pass) |
| unexpected indent | 이유 없이 줄을 들여씀 | 앞의 불필요한 공백 제거 |
| unindent does not match… | 닫는 깊이가 어느 단계와도 안 맞음 | 바깥 블록과 같은 깊이로 정렬 |
| TabError: inconsistent… | 탭·스페이스 혼용 | 전체를 스페이스 4칸으로 변환 |
💬 자주 묻는 질문
Q1들여쓰기는 스페이스 몇 칸이 정답인가요?
파이썬 문법상 칸 수는 자유이지만, 한 블록 안에서는 반드시 일관돼야 합니다. 표준 스타일 가이드인 PEP 8은 스페이스 4칸을 권장하고, 현실의 거의 모든 프로젝트가 이를 따릅니다. 2칸이나 8칸도 문법상 되긴 하지만, 협업을 생각하면 4칸으로 통일하는 게 정답에 가깝습니다.
Q2탭만 써도 되나요?
한 파일에서 탭만 일관되게 쓰면 파이썬은 정상 실행됩니다. 문제는 탭과 스페이스를 섞을 때 생기죠. 다만 탭은 편집기마다 폭이 달라 보여 협업에서 갈등을 부르기 때문에, 처음부터 스페이스 4칸으로 습관을 들이는 편이 훨씬 편합니다.
Q3인터넷에서 코드를 붙여넣으면 자꾸 에러가 나요.
웹 페이지의 코드에는 탭이 섞여 있거나 앞에 보이지 않는 공백이 딸려 오는 경우가 많습니다. 붙여넣은 뒤 에디터의 "공백 표시"를 켜서 탭·스페이스가 섞였는지 확인하고, "전체를 스페이스로 변환"을 한 번 돌려 주면 대부분 해결됩니다.
Q4에러 줄 번호를 봤는데 그 줄은 멀쩡해요.
파이썬이 알려 주는 줄은 "여기서 이상함을 처음 알아챘다"는 지점이라, 진짜 원인은 그 위에 있을 수 있습니다. 특히 unindent 오류는 기준이 되는 윗줄들의 들여쓰기가 어긋난 결과로 나타나기도 합니다. 문제 줄만 보지 말고 그 블록 전체의 들여쓰기를 함께 살피세요.
📌 정리하며
IndentationError와 TabError는 로직이 아니라 형식의 문제다. 파이썬에서 들여쓰기는 다른 언어의 중괄호와 같은 문법 요소라, 그 경계가 흐트러지면 코드가 멈춘다. 그래서 이 에러를 만나면 "메시지를 정확히 읽고, 그 블록의 들여쓰기를 통일한다"는 두 걸음이면 대부분 끝난다.
실무 원칙을 세 가지로 남긴다.
🧠 메시지부터 읽는다. expected an indented block은 안 들여쓴 것, unexpected indent는 괜히 들여쓴 것, unindent does not match는 닫는 깊이가 어긋난 것, TabError는 탭·스페이스를 섞은 것이다.
⚔️ 탭과 스페이스는 절대 섞지 않는다. 눈에 안 보이는 이 혼용이 가장 잡기 어려운 원인이다. 처음부터 스페이스 4칸으로 통일한다.
🛠 에디터로 예방한다. "탭을 스페이스로 삽입", "공백 표시", "전체를 스페이스로 변환"을 켜 두고, 자동 포맷터를 붙이면 다시는 안 만난다.
들여쓰기 오류 체크리스트
본 글은 파이썬 IndentationError·TabError의 일반적 원인과 해결 방법을 정리한 자료다. 편집기 설정은 사용하는 도구와 버전에 따라 메뉴 이름이 다를 수 있다.
#파이썬 #Python #IndentationError #TabError #파이썬에러 #들여쓰기 #탭스페이스 #파이썬문법 #인덴트 #파이썬초보 #SyntaxError #파이썬디버깅 #코딩 #프로그래밍 #VSCode
'IT' 카테고리의 다른 글
| 파이썬 인덱스 오류 (IndexError: list index out of range) 원인과 해결 (0) | 2026.07.07 |
|---|---|
| 파이썬 NoneType 오류 (TypeError: 'NoneType' object is not subscriptable) 원인과 해결 (0) | 2026.07.07 |
| 파이썬 모듈 없음 오류 (ModuleNotFoundError: No module named) 진짜 원인과 해결 (0) | 2026.07.03 |
| JS 에러 3대장 완전 정리 — TypeError·ReferenceError·SyntaxError 한눈에 (0) | 2026.07.02 |
| == vs === 완전 정리 — 느슨한 동등·엄격 동등·형 변환·NaN (0) | 2026.07.02 |
댓글