2016-06-02 2 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 

Warum next (a) Fehler geben, während nächste (ia) erstes Element der Liste in Python zurückgibt? Warum passiert es?Warum next (a) Fehler beim nächsten (ia) ersten Element der Liste in Python geben?

+4

Ist etwas in der Fehlermeldung 'TypeError: List-Objekt ist kein Iterator', das Sie nicht verstehen? – EdChum

+0

ja @EdChum kannst du mir sagen –

Antwort

3

Es ist buchstäblich durch das, was die Ausnahme Sie sagt:

list object is not an iterator

der Lage sein, eine Sequenz, die Sie einen aktuellen Standort haben müssen iterieren und eine Liste hat kein Konzept dafür, weil das bedeuten würde, dass Jeder, der die Liste teilt, würde auch den aktuellen Standort teilen.

Ein Iterator dagegen ist spezifisch für einen bestimmten Bereich und verfolgt den aktuellen Standort. Wenn Sie einen Iterator von einer Liste anfordern, erhalten Sie jedes Mal einen neuen Iterator.

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

Wie Sie sehen können, ia und ia2 haben unabhängige aktuellen Standorte, da sie unterschiedliche Iteratoren sind.

Um zu zeigen, warum wir das brauchen, hier ist ein Beispiel, das zwei Schleifen verwendet über die gleiche Liste iterieren:

>>> 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 

Dies funktioniert, weil jeder für Schleife eine separate Iterator verwendet.

Wenn wir statt ihnen die gleiche Iterator machen verwenden wir bekommen sehr unterschiedliche Ergebnisse:

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

Dieses Mal teilen sich beide Iteratoren den aktuellen Standort und als solche werden wir nur über die Liste einmal durchlaufen, unabhängig davon, die Tatsache, dass die Schleifen verschachtelt sind.

Verwandte Themen