반응형
1. for문에서 remove() 쓸 때 문제점
리스트를 for문으로 돌릴 때,
remove() 함수로 리스트의 원소를 제거할 때가 있다.
예를 들어,
CODES = [1,2,3,4]
for code in CODES:
print(code)
if code == 2:
CODES.remove(2)
print(CODES)
결과
1
[1, 2, 3, 4, 5]
2
[1, 3, 4, 5]
4
[1, 3, 4, 5]
1 → 2 → 다음이 3 이 아니라 4가 나온다.
for문에서 2의 순서일 때
remove() 함수로 리스트 CODES에서 2가 삭제되었기 때문이다.
그래서, 2의 자리에 3이 오고, 다음 순서인 4가 실행된 것이다.
즉, for문이 CODES를 돌고 있는데 돌고 있는 CODES가 훼손되어 오류가 난 것이다.
2. 해결 방법
CODES = [1,2,3,4]
for code in CODES[:]:
print(code)
if code == 2:
CODES.remove(2)
print(CODES)
for code in CODES[:]:
# CODES[:] 로 수정하여 CODES의 원본 복사본을 직접 넣는다.
특히, for문 안에 사용자 정의 함수(def)를 넣는 경우,
def 안에 remove() 함수가 사용될 수 있고
이런 경우, remove() 함수가 for문안에 사용되었는지 직관적으로 알아채기 어려우므로 주의가 필요하다.
3. 딕셔너리
딕셔너리 또한 for문에서 오류가 발생할 수 있습니다.
for문에서 딕셔너리를 삭제하기 위해 del을 사용할 경우
RuntimeError: dictionary changed size during iteration
오류가 발생할 수 있고,
리스트에서 하던 것처럼 [:]를 사용할 경우
slice 오류가 발생할 수 있습니다.
3-1. 해결방법
dictionary = dict()
dictionary['a'] = 1
for dic in list(dictionary):
print(dic)
del dictionary['a']
for문 딕셔너리에 list()로, 리스트화 합니다.
반응형
'컴퓨터 > Python' 카테고리의 다른 글
[Python] 파이썬, 네이버 뉴스 웹 크롤링 데이터 수집 (0) | 2022.03.11 |
---|---|
[Python] 파이썬, 시계열 주식 예측 fbprophet (0) | 2022.01.16 |
[Python] 파이썬, Matplotlib 실시간 주식 차트 업데이트 자동화 만들기 (6) | 2022.01.06 |
[Python] 파이썬, 주식 차트와 보조지표 그리기 (Plotly) (0) | 2021.12.20 |
[Python] 파이썬, 백트레이더(Backtrader)로 백테스팅 하기 (2) | 2021.11.30 |