Ich denke, dass ich weiß, wie Variablen und Generatoren in Python gut funktionieren.
Allerdings verwirrt mich der folgende Code.Variable Umfang in Generatoren in Klassen
from __future__ import print_function
class A(object):
x = 4
gen = (x for _ in range(3))
a = A()
print(list(a.gen))
Wenn Sie den Code (Python 2) laufen, heißt es:
Traceback (most recent call last): File "Untitled 8.py", line 10, in <module> print(list(a.gen)) File "Untitled 8.py", line 6, in <genexpr> gen = (x for _ in range(3)) NameError: global name 'x' is not defined
In Python 3, heißt es NameError: name 'x' is not defined
aber, wenn ich laufe:
from __future__ import print_function
class A(object):
x = 4
lst = [x for _ in range(3)]
a = A()
print(a.lst)
Der Code funktioniert nicht in Python 3, aber in Python 2 oder in einem Funktion wie dies
from __future__ import print_function
def func():
x = 4
gen = (x for _ in range(3))
return gen
print(list(func()))
Dieser Code auch in Python 2 und Python 3 oder auf Modulebene arbeitet
from __future__ import print_function
x = 4
gen = (x for _ in range(3))
print(list(gen))
Der Code funktioniert gut in Python 2 und Python 3 zu.
Warum ist es falsch in class
?
Die Anweisung 'es wird außerhalb der Klasse ausgeführt (da Generatoren während der Laufzeit ausgewertet werden) und prüft auf die Referenz von x ** im aktuellen Bereich **' könnte argumentiert werden. Siehe http://ideone.com/bgef81 das Ergebnis ist [6,6,6], nicht [5,5,5], warum? – WeizhongTu