Python3에서 목록의 요소를 삭제하기 위해 for 루프를 사용할 때의 함정

不言
풀어 주다: 2018-04-19 11:28:45
원래의
2294명이 탐색했습니다.

다음 문서에서는 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 &#39;list_iterator&#39;>
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 오류를 보고합니다.

관련 권장 사항:


Python 목록에서 요소를 삭제할 때 주의해야 할 함정


위 내용은 Python3에서 목록의 요소를 삭제하기 위해 for 루프를 사용할 때의 함정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿