Python의 Call by Assignment

created:
last-updated:

Python을 자료구조, 알고리즘 기초 지식과 함께 배워보고 있다. Javascript, Typescript 외에 처음 배워보는 언어라서 작성 방식도 낯설고, 개념도 조금씩 다르다. 익숙해져보기를 목표로 배워보고 있다.

Call by Value (값에 의한 호출)

예) C / Java

void foo(int x) {
    x = 10;  // 복사본만 바뀜
}

int main() {
    int a = 5;
    foo(a);
    printf("%d", a); // 5
}

여기서 함수 안 xa복사본 → 원본은 그대로다.

Call by Reference (참조에 의한 호출)

예) C++

void foo(int &x) {  // & 사용: 참조
    x = 10;
}

int main() {
    int a = 5;
    foo(a);
    cout << a; // 10
}

Python의 Call by Assignment (혹은 Call by Object Reference)

동작 방식

  1. 변수는 객체에 대한 이름표
  2. 함수 호출 시, 이름표를 복사 → 함수 안 변수는 원본 객체를 가리킴
  3. mutable 객체를 수정하면 원본 변경, immutable 객체는 변경 불가

예) mutable 객체 (리스트)

def foo(lst):
    lst.append(4)  # 원본 리스트 수정

my_list = [1,2,3]
foo(my_list)
print(my_list)  # [1,2,3,4] ✅

예) immutable 객체 (int)

def bar(x):
    x = x + 1  # 새로운 int 객체 할당

a = 5
bar(a)
print(a)  # 5 ✅ (원본 변경 없음)

JS 예제 (primitive or reference type 케이스와 Python 비교)

예) primitive (immutable)

let a = 5;
function foo(x) { x = x + 1; }
foo(a);
console.log(a); // 5

예) Object (mutable)

let obj = { val: 1 };
function bar(o) { o.val = 2; }
bar(obj);
console.log(obj.val); // 2
언어 Call 방식 값 타입 동작
JS Call by Value primitive 값 복사 → 함수 안 변경 불가
JS Call by Value object 참조값 복사 → 함수 안에서 객체 내부 변경 가능
Python Call by Assignment immutable 함수 안에서 새 객체 할당 → 원본 변경 불가
Python Call by Assignment mutable 함수 안에서 내부 값 변경 → 원본 변경 가능