2016-05-01 16 views
2

Kann mir jemand erklären, was hier vor sich geht, wie ichPython aufzählen - was kann ich nicht sehen?

Ich habe mit Elementen ein Modul weite Liste Variable flummoxed bin, die Felder - mylist mit ‚n‘ Einträgen, die jeweils field1, field2..fieldx

ich möchte, dass sie in einem Verfahren für den Zugriff auf so haben (mit einigen trace/Debug-Anweisungen)

print mylist [1].dataFieldCheckType 

for lIndex, lField in enumerate(mylist, start = 1): 

    print lField.dataFieldCheckType 

die erste print-Anweisung den Wert gibt -4 (was richtig ist), gibt der zweite einen anderen Wert, 0 , über einen einfachen Schritt mit einer Aussage. In meinen Augen wird lField als neues Element mit Standardwerten erstellt, aber ich weiß nicht, warum nicht. Warum gibt die zweite Druckanweisung einen anderen Wert als die erste?

Was mache ich falsch? Oder, vielleicht zutreffender, was verstehe ich nicht?

Ich habe das in einem anderen Forum gefragt, aber niemand hat eine plausible Erklärung gefunden.

+0

Ich brauchte eine Weile, um zu sehen, was Sie gefragt haben - zuerst dachte ich, Sie sagten, dass 0 falsch war, sagten aber nicht, was es sein sollte. Dann, nachdem ich eine ganze Reihe von Wiederholungen gelesen habe, vermute ich, dass Sie erwartet haben, dass der zweite 'Print' -4 druckt. Ich habe Ihre Frage bearbeitet, um dies zu klären. Bitte rollback, wenn ich missverstanden habe. –

Antwort

2

In enumerate(), start wird der Startindex nicht in das iterable angegeben. Es gibt den Startwert der Zählung an. enumerate() iteriert über das gesamte iterierbare Element, vom ersten (Index 0) bis zum letzten Element, unabhängig vom Parameter start.

Die erste print Anweisung in Ihrer Schleife druckt mylist[0].dataFieldCheckType, so wie es sein sollte. Sie hoffen nur, es wäre mylist[1].dataFieldCheckType.

Wenn Sie alle Elemente der Liste nehmen wollen in dem zweiten Start (Index 1), nur um es in Scheiben schneiden:

mylist[1:] 

Und wenn Sie wirklich den Index tun müssen, auch kombinieren, um die Scheibe mit enumerate() :

enumerate(mylist[1:], start=1) 
+0

DANKE, DANKE, DANKE !! – ADB

+0

Eine dieser Eigenheiten der Sprache, die kontra-intuitiv zu dem ist, was das Design sagt, sollte passieren. Oh, ich vermisse meine Assemblerprogramme - du wusstest was dann passiert ist! – ADB

+0

@ADB Ja, 'Start' ist ein sehr vager Name für diesen Parameter.Ich denke, die Logik ist "diese Elemente aufzählen * mit Zahlen, die beginnen ** mit *" –

2

enumerate ergibt (index + start, value) Tupel für jeden value eines iterable. Die optionalen start Parameter verwendet werden als ein Offset-Wert das erste Element des erzeugten Tupel zu berechnen:

>>> a = ['hi', 'stack', 'overflow'] 
>>> for x in enumerate(a, -4): 
...  x 
... 
(-4, 'hi') # 0 + (-4) 
(-3, 'stack') # 1 + (-4) 
(-2, 'overflow') # 2 + (-4) 

Wenn Sie Elemente eines iterable überspringen wollen, müssen aber nicht, dass die spezielle Scheibe im Speicher (alles, was Sie tun möchten, ist Iteration), verwenden itertools.islice:

>>> from itertools import islice 
>>> for x in islice(a, 2, None): 
...  x 
... 
'overflow' 

natürlich können Sie die beiden für große Gerechtigkeit kombinieren könnte.

>>> for x in islice(enumerate(a), 0, 2): 
...  x 
... 
(0, 'hi') 
(1, 'stack') 
Verwandte Themen