[Python] 리스트 복사하기

2 minute read

리스트 복사하기

파이썬에서 리스트를 복사(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