근 2년동안 파이썬을 다룰일이 없다가 인공지능 공부를 시작하면서 다시 파이썬을 사용하기 시작했습니다.
파이썬으로 과제를 하던 도중 분명 리스트에 값을 추가한적이 없는데 계속 이상한 값이 함께 출력돼서 코드를 들여다보았습니다.
그러던 도중 아주 근본적인 부분에서 실수한 것을 발견했습니다.
바로 리스트의 할당과 복사를 구분하지 않고 사용했던 것입니다.
그렇다면 파이썬에서 리스트의 할당과 복사는 어떻게 다를까요? 한번 살펴봅시다.
1. 리스트 할당
# 리스트 할당
list_a = [1,2,3]
list_b = list_a
list_a.append(10)
print(list_b)
# 실행결과>> [1, 2, 3, 10]
가장 먼저 list_a라는 리스트를 만들고, list_b라는 변수에 list_a 객체를 할당해주었습니다.
코딩을 접한지 얼마 안된 사람이라면 객체를 할당한다는 개념이 무엇인지 이해하기 쉽지 않을수도 있습니다.
list_b = list_a 라는 코드를 실행하면 list_b에는 [1, 2, 3]이라는 새로운 리스트가 생성되는것이 아니라! list_a 변수가 가지고 있던 리스트의 주소를 list_b에게도 넘겨주는 것입니다.
즉 list_a 와 list_b 는 동일한 객체에 대하여 접근하게 되는 것입니다.
그래서 아래의 list_a.append(10) 코드를 실행하면, list_b 의 값도 함께 변한것처럼 보이게 되는겁니다.
그림으로 설명해 보겠습니다.
list_a = [1, 2, 3] 이란 코드를 실행하면서 컴퓨터는 [1, 2, 3]리스트 객체를 만들고, 변수 list_a를 통해 그 객체에 접근할수 있습니다.
그리고 list_b = list_a 코드를 실행하면 list_b는 list_a가 가리키고 있는 객체와 연결됩니다.
그래서 list_a의 값이 변경되면, list_b의 값도 덩달아 바뀐 것처럼 보이게 됩니다.
2. 리스트 복사
# 리스트 복사
list_a = [1, 2, 3]
list_b = list_a.copy() # 방법1
list_b = list_a[:] # 방법2
list_a.append(10)
print(list_b)
# 실행결과>> [1, 2, 3]
리스트를 복사하는 방법에는 copy() 메소드를 사용하는 방법이 있습니다.
copy() 메소드를 사용하면 변수가 가리키는 객체와 같은 값을 가지는 또다른 객체가 생성되어 반환됩니다.
즉 list_b = list_a.copy() 코드를 실행하면 list_a와 list_b는 서로 다른 객체를 가지게 되는 것입니다.
또 다른 방법으로는 리스트의 인덱싱 기법을 사용하는 방법이 있습니다.
list_a[num1 : num2] 의 의미는 list_a의 num1인덱스부터, num2 인덱스까지만 추출해서 반환하는 것입니다. 이때 반환되는 리스트는 list_a의 리스트 객체와는 다른값을 가지는 또 다른 객체를 만들어 반환됩니다.
만약 인덱싱 기법에서 한쪽 숫자가 빠지면 그것은 (처음부터) 또는 (끝까지)를 의미합니다.
예를들어 list_a[ : num2] 의 경우는 list_a의 첫번째 요소부터 num2번째 요소까지, list_a[num1: ]은 list_a의 num1번째 요소부터 마지막 요소까지 가지는 리스트를 반환합니다. 그리고 list_a[ : ]의 경우는 list_a의 모든 원소를 가지는 리스트를 반환합니다. 이때 list_a와 같은 값을 가지는 객체를 만들어 반환합니다. 즉 객체가 복사되는것과 같다고 볼수 있습니다.
리스트 복사 개념에 대해 그림으로 살펴봅시다.
list_b = list_a[:] 코드처럼 리스트를 복사하게 되면, 각 변수는 각자 다른 객체와 연결됩니다.
list_a와 list_b는 서로 다른 객체를 가지고 있기 때문에 list_a의 값을 변경하여도 list_b의 값에는 아무런 변화가 없습니다.
지금까지 파이썬에서 리스트의 할당과 복사의 차이에 대해 알아봤습니다.
이 개념을 혼동하시면 나중에 리스트를 다루실 때, 내 의도와는 다르게 코드를 작성할 수 있으니 잘 이해하셨으면 좋겠습니다. 감사합니다.
'이것저것 > 그 이외의 것들' 카테고리의 다른 글
우아한 테크 캠프 7기 지원 후기 (2) | 2024.06.02 |
---|---|
'pip3' 은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. (0) | 2022.08.30 |