[파이썬] 리스트 올바르게 복사하기

cjkangme·2023년 1월 5일
0
post-custom-banner

파이썬 리스트 복사의 함정

  • list1의 값을 변경해야하는데 기존 list1의 값도 따로 저장해두고 싶다면, 리스트를 복사한 새로운 리스트를 만들어야 한다.
  • list1을 그대로 복사한 list2를 만들고 싶다면 어떻게 해야할까?

그냥 새로운 변수에 할당하면?

list1 = [1, 2, 3, 4]
list2 = list1

list1[0] += 2

print(list1)
# >>> [3, 2, 3, 4]
print(list2)
# >>> [3, 2, 3, 4]
  • 분명 list2라는 새로운 리스트를 만들었는데, list1에 변경한 값이 그대로 출력되는 것을 알 수 있다.
  • 파이썬에서 변수는 값이 저장되어 있는 메모리의 주소값을 저장하기 때문이다

  • 위 방법처럼 할당했을 때, list2는 list1이 저장한 주소값을 가져온 것이 되므로 메모리에 바뀐 값이 그대로 반영되어 출력되는 것이다.
  • 이는 주소값을 출력하는 id() 함수를 이용하면 확인할 수 있다.
list1 = [1, 2, 3, 4]
list2 = list1

print(id(list1))
# >>> 2542045329856
print(id(list2))
# >>> 2542045329856
  • [1, 2, 3, 4]를 저장하는 새로운 객체를 만들고 싶다면 다른 방법을 이용해야한다.

리스트를 올바르게 복사하는 방법

  • 여러가지 방법이 있지만, 가독성 면에서 좋은 방법이라 생각되는 두 가지만 소개한다.

1. list() 함수

  • list 자료형의 객체를 생성하는 list()함수를 이용할 수 있다.
list1 = [1, 2, 3, 4]
list2 = list(list1)

print(id(list1))
# >>> 2230699258752
print(id(list2))
# >>> 2230699336000 (다르다!)

2. copy() 메소드

  • Python3 부터 지원하는 리스트 객체의 메소드이다.
  • 파라미터 없이 새로운 리스트 객체를 만들어 반환한다.
list1 = [1, 2, 3, 4]
list2 = list1.copy()

print(id(list1))
# >>> 1549616375232
print(id(list2))
# >>> 1549616374528 (다르다!)

확인

list1 = [1, 2, 3, 4]
list2 = list1
list3 = list(list1)
list4 = list1.copy()

list1[0] += 2
list3[1] += 2
list4[2] += 2

print(list1)
# >>> [3, 2, 3, 4]
print(list2)
# >>> [3, 2, 3, 4]
print(list3)
# >>> [1, 4, 3, 4]
print(list4)
# >>> [1, 2, 5, 4]
  • list1의 주소를 복사한 list2를 제외하면, 모두 별개의 객체임을 확인할 수 있다.
post-custom-banner

0개의 댓글