다음 문서에서는 Python3에서 목록의 요소를 삭제하기 위해 for 루프를 사용할 때의 함정에 대해 자세히 설명합니다. 이 문서는 좋은 참고 가치가 있으며 모든 사람에게 도움이 되기를 바랍니다. 함께 살펴보겠습니다
for 루프 문의 객체는 반복 가능한 객체입니다. 반복 가능한 객체는 __iter__ 또는 iter 메서드를 구현하고 반복자를 반환해야 합니다. 반복자는 __next__ 또는 next 메서드만 구현하면 됩니다.
이제 목록이 반복을 지원하는 이유를 확인해 보겠습니다.
x = [1,2,3] its = iter(x) # its = x.__iter__() print(type(its)) # print(its.__next__()) # print(its.__next__()) # print(its.__next__()) print(next(its)) print(next(its)) print(next(its))
결과:
<class 'list_iterator'> 1 2 3
문은 어떻게 반복되나요? 단계는 다음과 같습니다.
(1) 먼저 객체가 반복 가능한 객체인지 확인합니다. 그렇지 않으면 오류를 직접 보고하고 TypeError 예외를 발생시킵니다. 그렇다면 __iter__ 또는 iter 메서드를 호출하여 반복자를 반환합니다. 2) 계속 반복자의 __next__ 또는 next 메소드를 호출하고 매번 순서대로 반복자에 값을 반환합니다.
(3) 끝까지 반복하고 더 이상 요소가 없으면 StopIteration 예외가 발생하고 Python 이 예외는 자체적으로 처리되며 개발자에게 노출되지 않습니다
list1 = [1,2,3,4,5,6] for i in list1: if i == 2: list1.remove(i) print(i) print(list1)
결과:
1 2 4 5 6 [1, 3, 4, 5, 6]
두 번째 인쇄의 결과는 분명히 요소 2가 있는 목록입니다. for 문을 실행하면 먼저 iterator가 생성되고, 그 다음 요소 2가 실행될 때 iterator의 값을 순서대로 반환하는 next 메소드가 사용되기 때문입니다. 목록에서 삭제되면 요소 3의 인덱스가 원래 요소가 됩니다. 인덱스 2는 요소 3을 요소 2의 위치로 앞으로 밀어넣으므로 다음 메서드는 값 3을 반환하지 않습니다. Python에서는 iter 함수를 사용할 수 있습니다. 나는 개인적으로 반복자를 다음 포인터가 있는 단방향 연결 목록으로 이해합니다. 얻은 반복자는 연결 목록의 헤더입니다. 다음 포인터는 순서화된 집계 유형의 첫 번째 요소를 가리킵니다.
연결된 목록의 마지막 요소의 다음 포인터에 액세스하면 Python은 StopIteration 오류를 보고합니다.
관련 권장 사항:
위 내용은 Python3에서 목록의 요소를 삭제하기 위해 for 루프를 사용할 때의 함정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!