Python 기초

리스트 복사하기

파이썬에서 리스트 변수는 리스트 객체를 직접 저장하고 있지 않습니다.

리스트 자체는 다른 곳에 저장되고 리스트의 참조값(reference)만 변수에 저장됩니다. 참조값이란 메모리에서 리스트 객체의 위치입니다.

평상시에는 이런 사소한 것에 신경 쓸 필요는 없지만 리스트를 복사하려고 할 때 약간의 신경을 써야 합니다.

 

만약 우리가 리스트를 복사하기 위하여 아래와 같은 문장을 실행하면 어떤 일이 벌어질까요?

scores = [10, 20, 30, 40, 50]
values = scores

 

결론부터 말하면 리스트는 복사되지 않습니다. scores와 values는 모두 동일한 리스트 객체를 가리키고 있습니다.

values는 scores 리스트의 별칭이나 마찬가지입니다. 이것을 얕은 복사(shallow copy)라고 합니다.

 

만약 우리가 values를 통하여 리스트 요소의 값을 변경한다면 scores 리스트도 변경됩니다.

scores = [10, 20, 30, 40, 50]
values = scores
values[2] = 99		# 리스트 value를 변경하였습니다.

for element in scores:
	print(element, end=" ")

 

<실행 결과>

10 20 99 40 50

 

그렇다면 리스트를 올바르게 복사하는 방법은 무엇일까요? 이것을 깊은 복사(deep copy)라고 합니다. 몇 가지 방법이 있습니다.

한 가지 방법은 list() 메소드를 사용하는 것입니다. list() 내장 함수는 리스트를 받아 복사본을 생성하여 반환합니다.

scores = [10, 20, 30, 40, 50]
values = list(scores)
values[2] = 99		# 리스트 value를 변경하였습니다.

print(scores)
print(values)

 

<실행 결과>

[10, 20, 30, 40, 50]
[10, 20, 99, 40, 50]

 

다음과 같이 deepcopy() 메소드를 사용하는 방법도 있습니다. deepcopy() 내장 함수도 리스트를 받아 복사본을 생성하여 반환합니다.

from copy import deepcopy
scores = [10, 20, 30, 40, 50]
values = deepcopy(scores)