파이썬의 변수 전달 방식 (Call by Value vs Call by Reference), 그리고 폰 노이만 구조

Yeeun·2025년 4월 30일

Python

목록 보기
27/31

파이썬의 변수 전달 방식 (Call by Value vs Call by Reference), 그리고 폰 노이만 구조


🧠 파이썬 변수 전달 방식, 튜플과 리스트, 그리고 폰 노이만 구조

코딩을 하다 보면, 함수에 값을 넘겨서 수정했는데 바뀌지 않는다든지, 원본이 의도치 않게 바뀌었다든지 하는 경험이 종종 있다. 이럴 땐 파이썬의 변수 전달 방식과 컴퓨터 구조 개념인 폰 노이만 구조를 함께 이해하면 훨씬 명확해진다.


🔌 폰 노이만 구조란?

폰 노이만 구조는 컴퓨터의 기본 설계 원칙이다. 이 구조에서 프로그램과 데이터는 모두 메모리에 저장되고, CPU가 순차적으로 실행한다.

즉, 메모리 안에 변수들이 있고, 함수 호출 시 그 변수들의 값이나 참조가 복사되어 전달된다.


🧪 예제 1: 숫자형 (불변 객체)

def p(a):
    a = 5  # 함수 안에서만 바뀜

a = 3
p(a)
print(a)  # 👉 결과: 3
  • int는 immutable (불변 객체) 이기 때문에,
  • 함수 안에서 a = 5는 새로운 값 5를 지역변수 a에 할당한 것일 뿐,
  • 원래의 a는 바뀌지 않는다.

🔬 예제 2: 리스트 (가변 객체)

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✅ 가능✅ 변경 가능 (복사 안 하면)

📌 기억할 점

  • "값을 넘긴다"고 해도, 가변 객체는 참조가 전달됨
  • 불변 객체는 수정이 아닌 재할당만 가능
  • 원본을 보호하려면 슬라이싱 또는 copy 사용
  • 기본은 값의 참조를 복사하는 구조 → 폰 노이만 구조 기반

파이썬에서 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 문은 값을 반환하고, 할당은 함수 내에서만 할 수 있습니다. 값을 변경하려면 할당 후 반환하거나, 함수 외부에서 할당해야 합니다.
  • 파이썬은 객체의 참조를 전달하기 때문에 불변 객체는 함수 내에서 변경할 수 없습니다.

0개의 댓글