[파이썬] 리스트 복사하기

반응형
    반응형

    리스트를 복사하는 이유

    파이썬으로 데이터분석에서 가장 중요한게 데이터입니다. 데이터를 보존해놔야 다른 모델을 쓰거나 다른 아이디어를 적용할 수 있기 때문에 반드시 복사를 해놔야합니다.

    가끔 리스트로서 데이터를 가지고 있을 때가 있는데 다른것도 마찬가지겠지만 코드 진행을 하다보면 리스트 내용이 바뀌면서(다중 참조) 어그러지기 때문에 원본 구분을 잘 해놓는게 중요합니다.

    리스트 복사하기

    슬라이싱을 사용한 복사

    보통 copy 매쏘드를 쓰는데 슬라이싱을 통해서도 할 수 있습니다.
    전체를 슬라이싱하면 복사본으로 인식합니다.

    original_list = [1,2,3,4,5]
    copied_list = original_list[:]

    copy를 이용한 복사

    copy 매쏘드를 이용한 방법입니다. 리스트 뒤에 copy()를 덧붙이면 됩니다.

    original_list = [1,2,3,4,5]
    copied_list = original_list.copy()

    위 두가지 방법은 원본 리스트를 복사해줍니다. 원본 리스트가 변경되지 않고 복사된 리스트만 변경되게 됩니다. 그렇지만 리스트 안에 있는 객체가 변할수있는(mutable) 상태라면 원본리스트와 복사된 리스트 모두 변경될 수 있습니다. 이런 경우 깊은복사(deep copy)를 이용하는 방법을 생각해봐야 합니다.

    deepcopy를 이용한 복사

    copy 모듈을 임포트해서 deepcopy를 합니다.

    import copy
    original_list = [[1,2,3],[4,5,6]]
    deep_copied_list = copy.deepcopy(original_list)

    완전 별개의 객체를 생성했습니다.

    copy와 deepcopy의 차이

    얕은복사(copy)를 하면 원본이 상황에 따라 변경될 수 있는데 그 상황을 확인해보겠습니다.

    import copy
    # 얕은 복사
    original_list = [1, [2, 3], 4]
    shallow_copy = copy.copy(original_list)
    
    # 내부 리스트 수정
    shallow_copy[1][0] = 99
    
    print(original_list)  # 출력: [1, [99, 3], 4]

    리스트 안에 리스트인 경우 객체로서 보기 때문에 내부 객체를 수정해버리면 얕은 복사인 경우 원본 리스트도 따라 변합니다. 숫자는 변경해도 원본리스트에 영향을 주지 않습니다.

    shallow_copy.pop()
    print(original_list)
    print(shallow_copy)

    깊은 복사를 하면 내부 객체 수정을 해도 원본 리스트는 변하지 않습니다.

    # 깊은 복사
    original_list = [1, [2, 3], 4]
    deep_copy = copy.deepcopy(original_list)
    
    # 내부 리스트 수정
    deep_copy[1][0] = 99
    
    print(original_list)  # 출력: [1, [2, 3], 4]

    마치며

    리스트를 통해 copy와 deepcopy에 대해 알아보았는데 코딩을 정신없이 치다보면 복사를 했는지 안했는지도 잘 기억이 나지 않으니 복사한 경우 꼭 복사 항목을 명확하게 알 수 있게 하는게 중요합니다. 원본 데이터 훼손이 일어나지 않게 코딩하시길 바랍니다.

     

    함께 보면 좋은 글

    [Python] 리스트 다루기(생성,추가,인덱싱)

    [Pandas] 데이터프레임 리스트,numpy 배열로 변환

    댓글

    Designed by JB FACTORY

    ....