[파이썬] 이차원 리스트의 깊은복사

JinUk Lee·2023년 3월 31일
0

파이썬 알고리즘 문제에서 깊은복사, 얕은 복사는 막 입문한 사람들을 헷갈리게 하는 개념이다.

얕은 복사는 주소값을 복사하는 것이고

깊은 복사는 그 값을 가져오는 것이다.

얕은복사



A = [1,2,3]

B = A

B[0] = 5

print(A) # [5,2,3]


B라는 변수를 = 을 활용하여 A를 복사했다.

그런데 B의 값을 바꾸면 A도 바뀐다.

B가 A의 주소값을 가져온 것이기 때문에 A도 영향을 받는 것이다.

깊은 복사


A = [1,2,3]

B = A[:]

B[0] = 5

print(A) # [1,2,3]

이번에는 리스트 슬라이싱을 활용하여 B라는 변수에 A를 복사했다.

똑같이 B의 값을 변경했는데 A의 값은 그대로다.

깊은 복사는 B의 실제 value만 가져오기 때문이다.

copy모듈

copy 모듈에서 copy는 얕은 복사, deepcopy는 깊은 복사이다.

그러나 deepcopy는 슬라이싱에 비해 처리 속도가 느리기때문에 슬라이싱을 쓰는 것을 지향해야한다.

이차원 리스트에서 깊은복사

깊은 복사가 필요한 문제는 슬라이싱으로 풀고있었는데 문제는 이차원 리스트에서 발생했다.



A = [ [1,2,3],[4,5,6]  ]

B = A[:]

B[0][0] = 100

print(A) # [[100, 2, 3], [4, 5, 6]]

깊은 복사를 했는데 원본인 A의 값이 B에 영향을 받는 것이였다.



A = [ [1,2,3],[4,5,6]  ]

B = A[:]

B[0] = [10,23,46]

print(A) # [[1, 2, 3], [4, 5, 6]]

그러나 위의 예시처럼 한줄 단위를 바꾸는 것은 영향을 받지 않았다.

즉, A와 B의 주소값은 다르지만 내부의 A[0]과 B[0]의 주소값이 같았다.

때문에 이차원 리스트를 슬라이싱으로 깊은 복사를 하기 위해서는 아래처럼 사용해야 한다.



A = [ [1,2,3],[4,5,6]  ]

B = [ arr[:] for arr in A ]

B[0][0] = 100

print(A) # [[1, 2, 3], [4, 5, 6]]

[ arr[:] for arr in A ] 을 잘 기억하자.

profile
개발자 지망생

0개의 댓글