2021. 1. 15. 01:35ㆍProgramming 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
(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 |