2016-06-02 3 views
-3
>>> a=[1,2,3,4,5,6] 
    >>> iter(a) 
    <listiterator object at 0x7f96f3273950> 
    >>> next(a) 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    TypeError: list object is not an iterator 
    >>> ia=iter(a) 
    >>> next(a) 
    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    TypeError: list object is not an iterator 
    >>> next(ia) 
     1 

왜 다음 (a) 다음 (ia) 파이썬에서 목록의 첫 번째 요소를 반환하는 동안 오류가 발생합니까? 왜 그런가?다음 (a) 다음 (ia)이 파이썬에서 목록의 첫 번째 요소를 반환하는 동안 오류가 발생하는 이유는 무엇입니까?

list object is not an iterator

당신이 현재 위치를 가질 필요가 시퀀스를 반복 할 수 있으려면 그는 것을 의미하기 때문에 목록이의 개념이 없습니다 :

+4

'TypeError : 목록 객체가 이해할 수없는 반복자가 아닙니다.'라는 오류 메시지가 있습니까? – EdChum

+0

예 @EdChum 말씀해 주시겠습니까? –

답변

3

말 그대로 때문에 예외가 당신을 말하고 무엇입니다 목록을 공유하는 모든 사람도 현재 위치를 공유합니다.

한편, 반복기는 특정 범위에만 적용되며 현재 위치를 추적합니다. 목록에서 반복자를 요청할 때마다 매번 새로운 반복자를 얻습니다.

>>> a = [1, 2, 3] 
>>> ia = iter(a) 
>>> ia2 = iter(a) 
>>> ia is ia2 
False 
>>> next(ia) 
1 
>>> next(ia2) 
1 

당신이 볼 수 있듯이, 서로 다른 반복자 때문에 IA 및 IA2독립적 현재 위치를 가지고있다. 우리가이 필요한 이유

여기에 동일한 목록을 반복하는 두 개의 루프를 사용하는 예제, 설명하기 위해이 작동

>>> for i in a: 
...  print("{}:".format(i)) 
...  for j in a: 
...    print("\t{}".format(j)) 
... 
1: 
     1 
     2 
     3 
2: 
     1 
     2 
     3 
3: 
     1 
     2 
     3 

을 루프마다 별도의 반복자를 사용하기 때문에. 우리가 그들을 대신 우리는 매우 다른 결과를 얻을 같은 반복자를 사용 한 경우

:이 시간

>>> a = iter(a) 
>>> for i in a: 
...  print("{}:".format(i)) 
...  for j in a: 
...    print("\t{}".format(j)) 
... 
1: 
     2 
     3 

는 모두 반복자는 현재 위치를 공유하고 같은 우리는 관계없이, 목록을 통해 한 번을 반복합니다 루프가 중첩되어 있다는 사실.