본문 바로가기

오늘의 코딩/Python3

[python]call by value, call by reference

python 으로 코딩을 하다보면 변수에 담긴 값이 내가 생각했던 것과 다른 경우가 종종 발생한다.

 

예를 들어, 다음과 같은 상황이다.

A = [1,2,3]
B = A

A.append(4)

print(A)
print(B)

>>[1,2,3,4]

>>[1,2,3,4]

 

A라는 변수의 값을 B = A 로 B 에 복사해놓(았다고 생각하)고 B의 값을 조작한 후 원본(인줄 알았던) A를 불러오니 죄다 바껴있는 경우가 있다.

 

이건 파이썬의 변수에 가변타입을 저장할 때 call by reference 형식을 따르기 때문이다.

 

1. call by value 와 call by reference

파이썬에서 변수에 값을 저장할 때, 자료타입에 따라 형식이 다르다.

 

변하지 않는 타입인 str, int 등을 저장할 때는 call by value 로 새로운 값을 만들어낸다.

그러나 가변타입인 list, dict 등의 형식을 저장할 때에는 call by reference 형식으로 값을 참조하도록 주소만 표시만 해둔다.

 

그러니 A의 내용물을 바꾸면 같은 주소를 가리키는 B를 불러왔을 때에도 변한 값이 나오는 것이다!

 

2. 얕은 복사와 깊은 복사

 

따라서 파이썬에서는 copy 라이브러리를 제공한다.

import copy

A = [1,2,3]
B = copy.copy(A)
C = copy.deepcopy(A)

A.append(4)

print(A)
print(B)
print(C)

>> [1,2,3,4]

>> [1,2,3,4]

>> [1,2,3]

 

copy 메서드는 얕은 복사를 지원하며, deepcopy 메서드는 깊은 복사, 즉 아예 새로운 개체를 만들어낸다!

처음에 자주 하는 실수이다. 유념해두자~!