ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [기능] 파이썬 리스트 복사 (python copy)
    Language Study/Python 2021. 4. 1. 22:27

    Copy

    파이썬에서 일반적으로 복사할 때 아래와 같은 형식으로 진행된다.

    list_A = ["ABC","DEF"]
    
    list_B = list_A

    하지만 이렇게 복사를 하는 경우 단순한 값에 대해서는 문제가 없지만,
    리스트를 복사할 때에는 C 언어에서 포인터만 지정한 것과 비슷한 경우된다.

    리스트 복사

    실제로 list는 1개만 존재하지만 2가지 이름으로 가리키는 것이다. 

     

    list_A = ["ABC","DEF"]
    
    list_B = list_A
    
    list_B.append("GHI")
    
    print(list_A)
    #결과 ["ABC","DEF","GHI"]

    위의 경우와 같이 B를 수정했지만 A에도 반영되고 있다. 그래서 단순히 = 로 복사하는 경우에는 문제가 생길 수 있다.

     

    Shallow Copy

    리스트와 같은 변형 객체에서는 다른 방법으로 복사를 해야 B를 수정해도 A가 바뀌지 않게 된다. 그 때 사용하는 것이
    shallow copy(얕은 복사)이다. 

    list_A = ["ABC","DEF"]
    
    list_B = list_A.copy()  # 1번 방법
    list_B = list_A[:]		# 2번 방법
    
    list_B.append("GHI")
    
    print(list_B)
    #결과 ["ABC","DEF","GHI"]
    
    print(list_A)
    #결과 ["ABC","DEF"]

    위와 같은 방법으로 복사를 하게되면 B 리스트를 수정하게 되어도 A리스트에 반영이 되지 않는다.
    하지만 shallow copy에도 문제점이 발생하는데 A와 B는 다른 객체를 가리키고 있지만 A와 B안에 존재하는 ABC는 같은
    요소의 특징을 가지고 있다는 것이다.



    즉, 요소가 변형 객체이면 변형 객체의 특성을 그대로 가져오게 되는 것이다.

    list_A = ["ABC",["DEF","GHI"]]
    
    list_B = list_A.copy()  # 1번 방법
    list_B = list_A[:]		# 2번 방법
    
    list_B[1][0] = ["GHI"]
    
    
    print(list_A, list_B)
    #결과 ['ABC', [['GHI'], 'GHI']] ['ABC', [['GHI'], 'GHI']]

    A 안에 변형 객체인 리스트로 값을 넣어두고 복사한 B에서 변경하게 되면 똑같이 A에서도 변경되는 것을 볼 수 있다.

     

    Deep Copy

    얕은 복사에서 발생하는 문제점을 해결한 것이 Deep copy(깊은 복사)이다.
    객체의 변형성에 따라서, 불변형 객체는 그대로 가져오고 변형 객체는 새로운 공간에 값을 복사하여 가져오게 되는 것이다.
    즉, 두 객체는 같은 값을 가진 완전히 다른 객체가 된다고 생각할 수 있다.
    그래서 어느 한 쪽을 수정하더라도 다른 쪽에 영향을 주지 않게된다.

     

    import copy
    
    list_A = ["ABC",["DEF","GHI"]]
    
    list_B = copy.deepcopy(list_A)
    
    list_B[1][0] = ["GHI"]
    
    print(list_A, list_B)
    #결과 ['ABC', ['DEF', 'GHI']] ['ABC', [['GHI'], 'GHI']]

    copy 모듈을 이용하여 deepcopy함수를 호출한다.
    B의 변형 객체를 수정하였지만 A에서는 반영되지 않는 것을 알 수 있다.

    동일한 객체인지 판단하는 is 를 사용해서 확인해보면
    list_A is list_B
    >>> False
    list_A[0] is list_B[0]
    >>> True
    list_A[1] is list_B[1]
    >>> False
    로 결과가 나오는 것을 알 수 있다.

    deepcopy의 경우 완벽한 복사를 할 수 있지만 새로운 곳에 생성하는 것 때문에 시간이 오래걸리고 메모리를 많이 사용한다는 단점이 존재한다.
    그래서 항상 deepcopy를 이용하는 것이 아니라 상황에 따라서 shallowcopy도 같이 사용하게된다.

    댓글

From BlackHair