#python #anaconda #jupyter-notebook #visual-code #html #css #javascript #http

제목[re]loop 1 실습 마지막 문제입니다.2022-04-14 21:27
작성자

첫 번째 코드와 같이 list 원본에서 원소를 꺼내면서 for문을 돌리는데 remove 함수를 사용하는 것은 매우 위험한 행위입니다.

예를 들어, 아래 코드를 실행시켜보면 [2, 4] 결과가 출력이 됩니다.

a = [1, 2, 3, 4, 5]

for i in a:

a.remove(i)

print(a)


위 코드는 아래와 같이 동작합니다.

Iter0: a = [1, 2, 3, 4, 5], index = 0    => 지워지는 item = 1

Iter1: a = [2, 3, 4, 5], index = 1    => 지워지는 item = 3

iter2: a = [2, 4, 5], index = 2    => 지워지는 item = 5

result: a = [2, 4]


즉, a 리스트 원본에서 item 하나하나 가져오는 위 for문의 경우, 중간에 원본이 변경되면 indexing이 꼬일 수 있습니다.

따라서 for문 안에 리스트의 원소를 제거, 추가의 기능을 넣고 싶을 때는 리스트의 복사본을 사용해야 합니다.

그 경우가 바로 "for i in c[:]:"의 두 번째 코드입니다.

print(id(c))

print(id(c[:]))


위 코드를 실행시키면 두 리스트의 id가 다르다는 것을 확인할 수 있습니다.

즉, c[:]는 c의 원본이 아닌, 다른 메모리에 생성된 복사본이라는 의미입니다.

따라서 for문이 가져오는 index가 꼬일 일이 없습니다.

댓글
이전loop 1 실습 마지막 문제입니다.2022-04-14
다음VS code 출력 지연 질문2022-04-14