일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- hoisting
- JavaScript
- 프리코스
- 쿠버네티스
- v-if
- 리스트복사
- 우테코
- v-model
- 도커
- 객체지향의 사실과 오해
- 빅오표기법
- Python
- 이벤트버블링
- 2588번
- 백준
- vue
- LeetCode
- 이벤트캡쳐링
- 젠킨스
- 3003번
- MSA
- 실행 컨텍스트
- 10926번
- DevOps
- 배열파티션
- v-on
- v-for
- 코어자바스크립트
- 파이썬
- 10869번
Archives
- Today
- Total
새오의 개발 기록
파이썬 리스트 복사 에러: IndexError: list assignment index out of range 본문
에러 내용
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의 요소들이 더해져 결과적으로 우리가 원하는 복사가 이뤄진다.
참고
'Python' 카테고리의 다른 글
python: 입력처리 (1) | 2022.11.17 |
---|---|
Python : annotation 함수에서 화살표(->) (0) | 2022.08.26 |