Liste Comprehensions haben ihren Code direkt in der Funktion platziert, wo sie verwendet werden, wie folgt aus:Warum verwenden Generator-Ausdrücke und Dict/Set-Comprehensions in Python 2 im Gegensatz zu Listen-Comprehensions eine verschachtelte Funktion?
>>> dis.dis((lambda: [a for b in c]))
1 0 BUILD_LIST 0
3 LOAD_GLOBAL 0 (c)
6 GET_ITER
>> 7 FOR_ITER 12 (to 22)
10 STORE_FAST 0 (b)
13 LOAD_GLOBAL 1 (a)
16 LIST_APPEND 2
19 JUMP_ABSOLUTE 7
>> 22 RETURN_VALUE
Während Generator Ausdrücke und dict/set Comprehensions sind meist in einer separaten verschachtelte Funktion gesetzt, wie folgt aus:
>>> dis.dis((lambda: {a for b in c}))
1 0 LOAD_CONST 1 (<code object <setcomp> at 0x7ff41a3d59b0, file "<stdin>", line 1>)
3 MAKE_FUNCTION 0
6 LOAD_GLOBAL 0 (c)
9 GET_ITER
10 CALL_FUNCTION 1
13 RETURN_VALUE
>>> dis.dis((lambda: {a for b in c}).func_code.co_consts[1])
1 0 BUILD_SET 0
3 LOAD_FAST 0 (.0)
>> 6 FOR_ITER 12 (to 21)
9 STORE_FAST 1 (b)
12 LOAD_GLOBAL 0 (a)
15 SET_ADD 2
18 JUMP_ABSOLUTE 6
>> 21 RETURN_VALUE
In Python 3 sind alle diese in einer geschachtelten Funktion platziert.
Warum wird der Code in einer separaten verschachtelten Funktion platziert? Ich erinnere mich vage daran, etwas über Leute gelesen zu haben, die Verständnis und/oder Genexpr-Variablen fixieren wollten, die vor langer Zeit in den umgebenden Bereich verschüttet wurden, war das die Lösung für das oder so?
Warum werden List Comprehensions anders als der Rest in Python 2 implementiert? Wegen der Rückwärtskompatibilität? (I dachte Ich hörte die Rede über Verschütten viel reparieren, nachdem Generator Ausdrücke eingeführt wurden, obwohl, aber ich habe gerade wirklich alte Diskussionen gelesen, oder etwas)
Hier ist [a link] (https://mail.python.org/pipermail/python--3000/2007-March/006017.html) zu dem Thread, wo Nick Coghlan und Georg Brandl die Gründe für die Umsetzung auf diese Weise diskutieren – Felipe