
파이썬을 처음 배우면 “왜 이렇게 되는지”가 안 잡혀서 답답한 구간이 옵니다.
그런데 이건 실력이 부족해서가 아니라, 언어가 동작하는 방식이 낯설어서 생기는 문제입니다.
이번 글에서는 초보자가 가장 많이 헷갈려 하는 개념 7가지를,
예시 코드 → 결과 → 왜 그런지 → 실전 팁 순서로 아주 구체적으로 정리합니다.
1) 변수는 “상자”가 아니라 “이름표”입니다 (참조 개념)
초보자가 가장 먼저 오해하는 게 이겁니다.
- X 변수 = 값이 들어있는 상자
- O 변수 = 값(객체)을 가리키는 이름표
예시) 숫자(정수)는 비교적 헷갈림이 덜한 편
a = 10
b = a
a = 20
print(a) # 20
print(b) # 10
왜 b는 10일까요?
b = a는 “a 상자를 b로 복사”가 아니라,
a가 가리키던 값(10)을 b도 가리키게 만든 것입니다.
그런데 a = 20을 하면, a가 새로운 값(20) 을 가리키도록 바뀌고,
b는 여전히 기존 값(10) 을 가리키는 상태로 남습니다.
핵심 요약
- = 는 “값을 넣는다”가 아니라, 어떤 대상을 가리키게 한다에 가깝습니다.
- 이 개념이 안 잡히면, 리스트/딕셔너리에서 본격적으로 사고가 납니다.
2) = 와 == 는 완전히 다른 연산입니다
초보자 실수 TOP 1 입니다.
- = : 대입(저장)
- == : 비교(같은지 검사)
예시 1) 대입
a = 5
a가 5를 가리키게 만들기
예시 2) 비교
print(a == 5) # True
print(a == 6) # False
흔한 실수
if a = 5: # 문법 오류
print("ok")
이건 파이썬이 “대입을 조건문에 쓰지 마”라고 막아두었기 때문에 에러가 납니다.
(다른 언어는 허용하기도 해서 더 헷갈립니다.)
실전 팁
조건문에서는 거의 항상 == 또는 in이 나옵니다.
3) if문은 True/False만 받는 게 아니라 “참/거짓 같은 값”을 받습니다
파이썬은 조건문에서 True/False가 아니어도 평가합니다.
if 1:
print("실행됨")
파이썬의 규칙(매우 중요)
False로 취급되는 값들
- 0
- None
- "" (빈 문자열)
- [], {}, () (빈 리스트/딕트/튜플)
- set() (빈 집합)
그 외 대부분은 True입니다.
예시
items = []
if items:
print("아이템 있음")
else:
print("비어 있음")
결과: 비어 있음
왜 이게 좋은가?
초보자는 이런 식으로 쓰려고 합니다:
if len(items) == 0:
...
파이썬에서는 더 자연스럽게:
if not items:
...
실전 팁
- “비어있으면 False”를 기억하면 코드가 짧고 읽기 좋아집니다.
4) 리스트를 “복사”했다고 생각했는데 같이 바뀌는 이유
이건 초보자들이 제일 많이 멘붕 오는 지점입니다.
a = [1, 2, 3]
b = a
b.append(4)
print(a) # [1, 2, 3, 4]
print(b) # [1, 2, 3, 4]
왜 a도 바뀌죠?
b = a는 리스트를 복사한 게 아니라
a가 가리키는 리스트를 b도 같이 가리키게 만든 것입니다.
즉,
- a와 b는 “서로 다른 리스트”가 아니라
- “같은 리스트를 바라보는 두 이름표”입니다.
진짜 복사는 이렇게 합니다
a = [1, 2, 3]
b = a.copy() # 또는 b = a[:]
b.append(4)
print(a) # [1, 2, 3]
print(b) # [1, 2, 3, 4]
더 깊은 함정: “중첩 리스트”는 copy로도 완전 복사가 아닙니다
a = [[1, 2], [3, 4]]
b = a.copy()
b[0].append(99)
print(a) # [[1, 2, 99], [3, 4]] ← 같이 바뀜
왜냐면 copy()는 겉 리스트만 새로 만들고,
안쪽 리스트는 같은 걸 공유하기 때문입니다.
완전 복사를 원하면:
import copy
b = copy.deepcopy(a)
5) 함수(Function) vs 메서드(Method) 차이
간단하지만 처음엔 헷갈립니다.
함수
len([1, 2, 3])
-
- 독립적으로 존재
- “어떤 값(객체)을 넣어서 결과를 받는” 느낌
my_list = [1, 2, 3]
my_list.append(4)
- 객체에 소속됨
- 점(.)으로 접근
- “이 객체가 직접 하는 행동” 느낌
직관적으로 이해하는 법
- 함수: “외부에서 도구로 처리”
- 메서드: “객체가 스스로 행동”
6) self는 “그 객체 자기 자신”입니다 (클래스 입문 최대 장벽)
클래스에 들어가면 초보자들이 거의 이렇게 생각합니다.
self는 파이썬 문법이라서 무조건 붙이는 주문이다
절반은 맞고, 절반은 틀립니다.
self는 “주문”이 아니라 대상 지정입니다.
예시
class Player:
def __init__(self, hp):
self.hp = hp
def hit(self, damage):
self.hp -= damage
여기서 self.hp는
- “이 플레이어의 hp”
Player는 설계도고, self는 실제로 만든 “플레이어 1명”입니다.
실제 사용
p1 = Player(100)
p2 = Player(50)
p1.hit(10)
print(p1.hp) # 90
print(p2.hp) # 50 (p2는 영향 없음)
self가 없었다면 p1과 p2의 체력을 구분할 방법이 없습니다.
실전 팁
- 메서드 안에서는 “전역 변수처럼” 쓰지 말고 무조건 self.로 연결된다고 생각하면 됩니다.
7) 에러 메시지는 “무서운 글”이 아니라 “정답 힌트”입니다
초보자 대부분은 에러가 뜨면 이렇게 합니다.
- 당황한다
- 빨간 글을 무시한다
- 구글에 전체 복붙한다
- 해결이 안 된다
하지만 에러에는 꼭 봐야 하는 핵심 3가지가 있습니다.
예시 에러
NameError: name 'x' is not defined
봐야 하는 것 1) 에러 종류
- NameError: 이름이 정의되지 않음
- TypeError: 타입이 맞지 않음
- IndexError: 인덱스 범위를 벗어남
봐야 하는 것 2) 파일/줄 번호
에러 메시지에 보통 이런게 뜹니다.
- File "main.py", line 12
→ 12번째 줄을 보라는 뜻입니다.
봐야 하는 것 3) 마지막 줄(결론)
대부분 마지막 줄이 결론입니다.
실전 팁
- 에러는 “원인 설명서”
- 마지막 줄부터 읽고, 그 다음 줄 번호로 이동하면 해결 속도가 빨라집니다.
마무리: 초보자라면 이 7개를 “의식적으로” 연습하면 됩니다
정리하면 초보가 가장 많이 헷갈리는 이유는 하나입니다.
파이썬이 “어떻게 동작하는지” 그림이 머릿속에 아직 없기 때문입니다.
그 그림을 만드는 핵심이 바로 이 7가지였습니다.
'기타 > 각종꿀팁' 카테고리의 다른 글
| 파이썬 에러 메시지별 해결 방법 총정리 (0) | 2026.02.09 |
|---|---|
| 파이썬 프로그램을 exe 파일로 만드는 방법 (0) | 2026.02.04 |
| 여러 파이썬 버전 환경에서 Pygame 설치하는 방법과 오류 해결법 (0) | 2025.12.23 |