[Python] Call by.. What?

2021. 1. 15. 01:35Programming Language/Python

Python은 Call by assignment 이다.

Call by assignment (Call by object reference)

파이썬은 immutable(불변) 자료형일 경우 call by value 처럼 처리되고,
mutable(가변) 자료형일 경우 call by reference처럼 처리 된다.
이를 call by assignment 또는 call by object reference 라고 부른다.

 

파이썬의 객체(object)에 대한 이해

파이썬은 모든것이 객체(Object)이다.

라는 말, 파이썬을 배운 사람이라면 한번쯤은 들어 봤을 것이다. 과연 무슨 뜻일까?

a = 10

파이썬에선 a에 10이 할당되는 것이 아니라, a가 10이라는 상수 객체를 참조하는 것이다.

import sys

a = 10
print(sys.getrefcount(a)) # 14

b = 10
print(sys.getrefcount(a)) # 15

sys모듈의 getrefcount를 이용하면 객체에 참조형 변수가 몇개인지 알 수 있는데, 실제로 객체에 대한 참조형 변수가 늘어날때마다 그 값은 증가한다. (a = 10에서 결과가 14인 이유는 파이썬이 내부적으로 객체 10을 참조하여 사용하고 있기 때문이다.)

 

immutable - call by value 처럼

int, float, bool, tuple, string, unicode 가 이에 해당한다.

x = 10

def foo(x):
    x += 10

foo(x)
print(x) # 결과: 10

함수가 실행되면, 지역변수 x 는 Stack Frame에 생성된다.


int는 immutable한 자료형 이기 때문에, 지역변수 x는 새롭게 20을 참조하게 되고, 함수가 종료되면 지역변수 x도 사라진다.
따라서 값이 변하지 않는 것이다.

 

mutable - call by reference 처럼

list, set, dict 가 이에 해당한다.

x = [1, 2, 3, 4]

def foo(x):
    x.append(5)

foo(x)
print(x)

똑같이 지역변수 x가 Stack Frame에 생성 되지만, list는 mutable한 자료형 이기 때문에 지역변수 x가 값을 새로 참조하지 않고, 원래 있던 객체가 변하게 된다.
따라서 함수 종료 후에 지역변수가 사라져도 값이 변하는 것이다.

Reference

4. More Control Flow Tools — Python 3.9.1 documentation

python - How do I pass a variable by reference? - Stack Overflow

Is Python call by reference or call by value - GeeksforGeeks

 

[Python]가변객체,불변객체 (velog.io)

 

 

(Stack Frame에 e 없는거 지금 발견했다.. 앗.   ...)

반응형

'Programming Language > Python' 카테고리의 다른 글

[Python] zip()  (0) 2021.01.26
[Python] heapq 모듈  (0) 2021.01.19
[Python] divmod()  (0) 2021.01.14
[Python] sys.maxsize - 최대 정수값  (0) 2021.01.11
[Python] if not x  (0) 2021.01.08