새오의 개발 기록

파이썬 리스트 복사 에러: IndexError: list assignment index out of range 본문

Python

파이썬 리스트 복사 에러: IndexError: list assignment index out of range

새오: 2022. 10. 7. 15:25

에러 내용

 

 

IndexError: list assignment index out of range

 

 

 

 

파이썬 리스트를 그대로 복사해서 사용하려고 했더니 위 에러가 난다.

list1 = [1,2,3,4]

list2 = list1

 

에러의 원인은 위 코드가 메모리 주소값을 복사한 것에 불과하다는 것에 있다.

같은 메모리를 참조하기 때문에 list1이 수정되면 list2도 동시에 수정된다.

 

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

>>> print('list1 :', list1, '/ id :', id(list1))
list1 : [1, 2, 3, 4] / id : 4552076160
>>> print('list2 :', list2, '/ id :', id(list2))
list2 : [1, 2, 3, 4] / id : 4552076160

>>> list1[0] = 11

>>> print('list1 :', list1)
list1 : [11, 2, 3, 4] 
>>> print('list2 :', list2)
list2 : [11, 2, 3, 4]

 

메모리 주소를 출력해보면 list1과 list2가 같은 것을 확인할 수 있다.

그래서 list1[0]의 값을 재정의 하면 list2[0]의 값까지 같이 바뀌게 된다.

정확히는 같이 값이 바뀌는게 아니라 같은 주소를 참조하기 때문이다.

 

 

 

 


 

 

해결 방법

 

1. 슬라이싱

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

시작점과 끝점을 생략한 슬라이싱은 리스트의 모든 요소를 뜻하기 때문에 슬라이싱을 통한 변수를 정의로 새로운 객체를 만들 수 있다.

 

 

2. list() 함수

>>> list1 = [1, 2, 3, 4]
>>> list2 = list(list1)

파이썬 내장함수 중에는 iterable한 객체를 리스트 객체로 변환해주는 list() 함수가 있다. 이 함수를 이용해 복사하고자 하는 리스트 객체를 다시 재선언 한다.

 

 

🌟👍 3. copy() 메소드

>>> list1 = [1, 2, 3, 4]
>>> list2 = list1.copy()

Python3 부터 리스트를 다른 리스트에 복사하는 기능인 copy() 메소드가 추가되었다. 가독성을 위한 코드라면 이 방법을 사용하는 것을 권장한다.

 

 

 

4. 리스트 연산

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

리스트 덧셈연산을 이용해 새로운 빈 리스트에 list1의 요소들을 더한다. 새로운 리스트 객체에 list1의 요소들이 더해져 결과적으로 우리가 원하는 복사가 이뤄진다.

 

 

 

 

참고

https://inkkim.github.io/python/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%A6%AC%EC%8A%A4%ED%8A%B8-%EB%B3%B5%EC%82%AC/

'Python' 카테고리의 다른 글

python: 입력처리  (1) 2022.11.17
Python : annotation 함수에서 화살표(->)  (0) 2022.08.26