23.4 2차원 리스트의 할당과 복사 알아보기

이번에는 2차원 리스트의 할당과 복사에 대해 알아보겠습니다. '22.2 리스트의 할당과 복사'에서 리스트를 다른 변수에 할당해도 변수 이름만 달라질 뿐 같은 리스트(객체)라고 했죠? 2차원 리스트도 마찬가지입니다.

다음과 같이 2차원 리스트를 만든 뒤 다른 변수에 할당하고, 요소를 변경해보면 두 리스트에 모두 반영됩니다.

>>> a = [[10, 20], [30, 40]]
>>> b = a
>>> b[0][0] = 500
>>> a
[[500, 20], [30, 40]]
>>> b
[[500, 20], [30, 40]]

그런데 리스트 acopy 메서드로 b에 복사한 뒤 b의 요소를 변경해보면 리스트 ab에 모두 반영됩니다.

>>> a = [[10, 20], [30, 40]]
>>> b = a.copy()
>>> b[0][0] = 500
>>> a
[[500, 20], [30, 40]]
>>> b
[[500, 20], [30, 40]]

2차원 이상의 다차원 리스트는 리스트를 완전히 복사하려면 copy 메서드 대신 copy 모듈의 deepcopy 함수를 사용해야 합니다.

>>> a = [[10, 20], [30, 40]]
>>> import copy             # copy 모듈을 가져옴
>>> b = copy.deepcopy(a)    # copy.deepcopy 함수를 사용하여 깊은 복사
>>> b[0][0] = 500
>>> a
[[10, 20], [30, 40]]
>>> b
[[500, 20], [30, 40]]

이제 리스트 b의 요소를 변경해도 리스트 a에는 영향을 미치지 않습니다. copy.deepcopy 함수는 중첩된 리스트(튜플)에 들어있는 모든 리스트(튜플)를 복사하는 깊은 복사(deep copy)를 해줍니다.

지금까지 2차원 리스트에 대해 배웠는데 문법이 조금 복잡했습니다. 다차원 리스트는 어려운 주제이므로 당장 이해가 되지 않는다면 그냥 넘어가도 됩니다. 일단 2차원 리스트는 세로, 가로 순으로 접근한다는 점만 기억하면 됩니다.