파이썬의 변수 전달 방식 (Call by Value vs Call by Reference), 그리고 폰 노이만 구조
코딩을 하다 보면, 함수에 값을 넘겨서 수정했는데 바뀌지 않는다든지, 원본이 의도치 않게 바뀌었다든지 하는 경험이 종종 있다. 이럴 땐 파이썬의 변수 전달 방식과 컴퓨터 구조 개념인 폰 노이만 구조를 함께 이해하면 훨씬 명확해진다.
폰 노이만 구조는 컴퓨터의 기본 설계 원칙이다. 이 구조에서 프로그램과 데이터는 모두 메모리에 저장되고, CPU가 순차적으로 실행한다.
즉, 메모리 안에 변수들이 있고, 함수 호출 시 그 변수들의 값이나 참조가 복사되어 전달된다.
def p(a):
a = 5 # 함수 안에서만 바뀜
a = 3
p(a)
print(a) # 👉 결과: 3
int는 immutable (불변 객체) 이기 때문에,a = 5는 새로운 값 5를 지역변수 a에 할당한 것일 뿐,a는 바뀌지 않는다.def p(a):
a[0] = 5
data = list(range(1, 11)) # [1,2,3,4,5,6,7,8,9,10]
p(data)
print(data) # 👉 결과: [5, 2, 3, ..., 10]
list는 mutable (가변 객체) 이기 때문에,def p(a):
a[0] = 5
data = list(range(1, 11))
p(data[:]) # 리스트 슬라이싱을 통해 복사본 전달
print(data) # 👉 결과: 원본 유지됨
data = tuple(range(1, 11))
p(data) # TypeError: 튜플은 수정 불가
tuple은 immutable, 즉 수정 불가능한 자료형이라서| 자료형 | 변경 가능? | 함수에 넘기면 원본 변경됨? |
|---|---|---|
int, float, str, tuple | ❌ 불가능 | ❌ 변경 안 됨 |
list, dict, set | ✅ 가능 | ✅ 변경 가능 (복사 안 하면) |
파이썬에서 return 문은 값을 반환하는 역할을 하며 값을 할당할 수 없다.
def p(a):
return a = 5 # 문법 오류! 할당을 return과 함께 쓸 수 없음.
a = 3
p(a)
print(a)
return a = 5에서 a = 5는 할당 문인데, return 구문 안에서는 할당이 아니라 값을 반환해야 합니다.
할당을 별도로 수행하고, 그 후 값을 반환하는 방식으로 코드를 수정해야 합니다.
def p(a):
a = 5 # 값을 변경
return a # 변경된 값을 반환
a = 3
result = p(a)
print(a) # 👉 결과: 3 (원본은 여전히 변경되지 않음)
print(result) # 👉 결과: 5 (반환된 값은 5)
a = 5는 함수 내부에서 a의 값을 변경하는 것입니다. 하지만 함수 외부의 a는 변경되지 않습니다.return은 값을 반환하는 문법이므로, 할당은 함수 내부에서만 일어나고, 반환되는 값은 5입니다.return 문은 값을 반환하고, 할당은 함수 내에서만 할 수 있습니다. 값을 변경하려면 할당 후 반환하거나, 함수 외부에서 할당해야 합니다.