[Python] 리스트 복사하기
리스트 복사하기
파이썬에서 리스트를 복사(copy)하는 방법에 대해 알아봅니다.
- 슬라이싱
- list( ) 함수
- copy( ) 메서드
- 리스트 연산
- copy.deepcopy( )
1. 슬라이싱
1차원 리스트
# 1차원 리스트
a = [1,2,3,4,5]
b = a[:]
print(a,b)
print(id(a), id(b))
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
2055991392256 2055991321280
b[0] = 6
print(a,b)
[1, 2, 3, 4, 5] [6, 2, 3, 4, 5]
2차원 리스트
# 2차원 리스트
a = [[1,2],[3,4],[5,6]]
b = a[:]
print(id(a),id(b))
print(id(a[0]),id(b[0]))
2055991184000 2055991432768
2055991475200 2055991475200
b[0] = [7,8]
print(a,b)
print(id(a[0]),id(b[0]))
[[1, 2], [3, 4], [5, 6]] [[7, 8], [3, 4], [5, 6]]
2055991475200 2055991178624
b[1][0] = 10
print(a,b)
print(id(a[1]), id(b[1]))
[[1, 2], [10, 4], [5, 6]] [[7, 8], [10, 4], [5, 6]]
2055991392256 2055991392256
list 함수
1차원 리스트
# 1차원 리스트
a = [1,2,3,4,5]
b = list(a)
print(a,b)
print(id(a), id(b))
[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
2055991383296 2055992016768
b[0] = 6
print(a,b)
[1, 2, 3, 4, 5] [6, 2, 3, 4, 5]
2차원 리스트
# 2차원 리스트
a = [[1,2],[3,4],[5,6]]
b = list(a)
print(id(a),id(b))
print(id(a[0]),id(b[0]))
2055991356608 2055992345472
2055991182976 2055991182976
b[0] = [7,8]
print(a,b)
print(id(a[0]),id(b[0]))
[[1, 2], [3, 4], [5, 6]] [[7, 8], [3, 4], [5, 6]]
2055991182976 2055991444736
b[1][0] = 10
print(a,b)
print(id(a[1]), id(b[1]))
[[1, 2], [10, 4], [5, 6]] [[7, 8], [10, 4], [5, 6]]
2055991373952 2055991373952
copy() 메서드
1차원 리스트
# 1차원 리스트
a = [1,2,3,4,5]
b = a.copy()
print(id(a), id(b))
2055991383296 2055992016768
b[0] = 6
print(a,b)
[1, 2, 3, 4, 5] [6, 2, 3, 4, 5]
2차원 리스트
# 2차원 리스트
a = [[1,2],[3,4],[5,6]]
b = a.copy()
print(id(a),id(b))
print(id(a[0]),id(b[0]))
2055992366784 2055992365888
2055992365952 2055992365952
b[0] = [7,8]
print(a,b)
print(id(a[0]),id(b[0]))
[[1, 2], [3, 4], [5, 6]] [[7, 8], [3, 4], [5, 6]]
2055992365952 2055991355904
b[1][0] = 10
print(a,b)
print(id(a[1]), id(b[1]))
[[1, 2], [10, 4], [5, 6]] [[7, 8], [10, 4], [5, 6]]
2055992367104 2055992367104
리스트 연산
1차원 리스트
# 1차원 리스트
a = [1,2,3,4,5]
b = [] + a
print(id(a), id(b))
2055991434880 2055991433152
b[0] = 6
print(a,b)
[1, 2, 3, 4, 5] [6, 2, 3, 4, 5]
2차원 리스트
# 2차원 리스트
a = [[1,2],[3,4],[5,6]]
b = [] + a
print(id(a),id(b))
print(id(a[0]),id(b[0]))
2055992376320 2055992375616
2055992375872 2055992375872
b[0] = [7,8]
print(a,b)
print(id(a[0]),id(b[0]))
[[1, 2], [3, 4], [5, 6]] [[7, 8], [3, 4], [5, 6]]
2055992375872 2055992365632
b[1][0] = 10
print(a,b)
print(id(a[1]), id(b[1]))
[[1, 2], [10, 4], [5, 6]] [[7, 8], [10, 4], [5, 6]]
2055992376000 2055992376000
copy.deepcopy()
1차원 리스트
# 1차원 리스트
from copy import deepcopy
a = [1,2,3,4,5]
b = deepcopy(a)
print(id(a), id(b))
2055992375936 2055992376768
b[0] = 6
print(a,b)
[1, 2, 3, 4, 5] [6, 2, 3, 4, 5]
2차원 리스트
# 2차원 리스트
from copy import deepcopy
a = [[1,2],[3,4],[5,6]]
b = deepcopy(a)
print(id(a),id(b))
print(id(a[0]),id(b[0]))
2055992345472 2055991355264
2055991182976 2055991368960
b[0] = [7,8]
print(a,b)
print(id(a[0]),id(b[0]))
[[1, 2], [3, 4], [5, 6]] [[7, 8], [3, 4], [5, 6]]
2055991182976 2055991444928
b[1][0] = 10
print(a,b)
print(id(a[1]), id(b[1]))
[[1, 2], [3, 4], [5, 6]] [[7, 8], [10, 4], [5, 6]]
2055991444288 2055991674752
정리
- 슬라이싱, list 함수, copy 메서드, 리스트 연산은 모두 1차원 리스트만 ‘제대로’ 복사합니다.
- copy.deepcopy 함수는 모든 리스트 뿐만 아니라, 딕셔너리, 클래스 객체까지도 ‘제대로’ 복사합니다. 다만 copy.deepcopy 함수는 해당 객체의 모든 것을 복사해내기 때문에, 다른 방법들보다 시간이 10~100 배까지도 더 걸립니다.
결론
-
1차원 리스트라면 슬라이싱, list 함수, copy 메서드, 리스트 연산 중 하나를 사용합니다.
-
2차원 리스트라면 슬라이싱, list 함수, copy 메서드, 리스트 연산 중 하나를 이용해 커스텀 함수를 구현하는 것이 성능이 좋습니다.
def custom_deepcopy(a):
b = []
for elem in a:
b.append(elem[:])
# b.append(list(elem))
# b.append(elem.copy())
# b.append([] + elem)
return b
- 3차원 이상의 리스트이거나 딕셔너리, 클래스 인스턴스와 같은 객체라면 copy.deepcopy를 사용합니다.
Leave a comment