[Python] 값의 복사와 참조

Python에서 값을 복사하는 방법을 정리한다.




얕은 복사와 깊은 복사

파이썬에서, 정수나 문자열 같은 기본 타입들은 값을 복사할 경우 깊은 복사로 처리된다.

무슨 말이냐 하면, 순수하게 모든 값이 그대로 복사된다는 것이다.
이런 기본값들에 대해서는 문제가 될 일이 없다.

문제는 객체를 추가로 정의해서 사용할 경우다.

객체의 값을 다른 변수에 복사하려고 시도를 해도,

실제로는 같은 것을 가리키는 변수가 된다. 객체는 기본적으로 참조를 통해서만 전달되기 때문이다.

이걸 해결하려면 copy 내장모듈의 deepcopy 기능을 사용하거나

그냥 객체 자체적으로 직접 구현하는 방법 밖에는 없다.




컬렉션 타입들

얕은 복사 문제가 발생하는건, 사용자가 정의한 클래스만 적용되는게 아니라 컬렉션 타입들에도 해당하는 문제다.

대표적으로 list만 해도 기본 동작이 참조 복사다.


진짜 복사를 수행하려면 copy 메서드를 사용해야만 한다.

딕셔너리(dict)도 마찬가지다.


예제 코드

class Point: 
    x: int 
    y: int

    def __init__(self, x: int, y: int) -> None:
        self.x = x
        self.y = y
        pass 

    pass 

def main() -> None:
    p: Point = Point(1, 2)
    p2: Point = p # 복사?

    p.x = 4444

    print(p.x)
    print(p2.x)

    pass

main()
import copy

class Point: 
    x: int 
    y: int

    def __init__(self, x: int, y: int) -> None:
        self.x = x
        self.y = y
        pass 

    pass 

def main() -> None:
    p: Point = Point(1, 2)
    p2: Point = copy.deepcopy(p) # 복사!

    p.x = 4444 # 값 변경

    print(p.x)
    print(p2.x)

    pass

main()