Python의 Call by Assignment

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 방식값 타입동작
JSCall by Valueprimitive값 복사 → 함수 안 변경 불가
JSCall by Valueobject참조값 복사 → 함수 안에서 객체 내부 변경 가능
PythonCall by Assignmentimmutable함수 안에서 새 객체 할당 → 원본 변경 불가
PythonCall by Assignmentmutable함수 안에서 내부 값 변경 → 원본 변경 가능
글 목록으로