2016-06-01 9 views
1

Ich habe ein Problem mit der Iteration über eine Liste von callables in Python. Die Callables sollen auf einem String-Generator aufgerufen werden. Das aktuelle Verhalten besteht darin, dass der letzte in der Liste aufrufbare Aufruf so oft aufgerufen wird, wie in der Liste aufrufbar ist. Mein aktueller Code:Problem mit der Iteration durch Liste von aufrufbaren

for m in list_of_callables: 
    strings = (m(s) for s in strings) 

In den oben genannten Code-Strings ist zunächst vom Typ 'Generator'. Ich habe auch versucht, die folgenden:

for i in range(len(list_of_callables)): 
    strings = (list__of_callables[i](s) for s in strings) 

Dies entweder nicht funktioniert hat, aber wenn ich über die Callables nicht Schleife tun und sie rufen Sie einfach es funktioniert gut:

strings = (list_of_callables[0](s) for s in strings) 
strings = (list_of_callables[1](s) for s in strings) 

Dies scheint seltsam Ich wie oben sollte gleichbedeutend mit der for-Schleife sein.

Vielen Dank im Voraus für Ihre Hilfe und Vorschläge :).

+3

Das klingt wie eine Episode von [späte Bindung Schließungen] (http://docs.python-guide.org/en/latest/ schreiben/gotchas/# späte-bindende-schließungen) –

+1

Wissen Sie, was 'generator' bedeutet? Ich denke, dass Sie [Listenverständnis] (https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions) anstelle eines [Generatorausdrucks] (https://docs.python.org) verwenden möchten /3/reference/expressions.html#generator-expressions). –

+1

Was ist das erwartete Verhalten hier? Ich bin verwirrt von Ihrer Wiederverwendung der Identifizierer "Strings" sowohl innerhalb als auch außerhalb des Generators. Das macht es sehr schwer, die Gründe für Ihren Code zu verstehen. –

Antwort

3
strings = (m(s) for s in strings) 

Dies gilt nicht wirklich Ihre aufrufbar nennen. Es erzeugt einen Generatorausdruck, der m später, unter Verwendung von was auch immer m zufällig später sein wird.

Nach der Schleife ist m das letzte aufrufbar. Wenn Sie versuchen, ein Element von strings abzurufen, suchen alle genesteten Genexps m, um einen Wert zu berechnen, und alle finden das letzte aufrufbare.

Sie können dieses Problem beheben, indem itertools.imap anstelle eines genexp mit:

strings = itertools.imap(m, strings) 
+0

Vielen Dank für Ihre Hilfe :) –