Dieses Verhalten wurde in Python 3 behoben. Wenn Sie ein Listenverständnis [i(0) + i(1) for a in alist]
verwenden, definieren Sie a
in seinem umgebenden Bereich, der für i
zugänglich ist. In einer neuen Sitzung wird list(i(0) + i(1) for a in alist)
Fehler werfen.
>>> i = lambda x: a[x]
>>> alist = [(1, 2), (3, 4)]
>>> list(i(0) + i(1) for a in alist)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
File "<stdin>", line 1, in <lambda>
NameError: global name 'a' is not defined
Eine Liste Verständnis ist kein Generator: Generator expressions and list comprehensions.
Generator expressions are surrounded by parentheses (“()”) and list comprehensions are surrounded by square brackets (“[]”).
In Ihrem Beispiel list()
als eine Klasse ihren eigenen Umfang von Variablen hat und Zugriff auf globale Variablen höchstens hat. Wenn Sie das verwenden, wird i
in diesem Bereich nach a
suchen. Versuchen Sie, diese in neue Sitzung:
>>> i = lambda x: a[x]
>>> alist = [(1, 2), (3, 4)]
>>> [i(0) + i(1) for a in alist]
[3, 7]
>>> a
(3, 4)
es dazu Vergleichen in einer anderen Sitzung:
>>> i = lambda x: a[x]
>>> alist = [(1, 2), (3, 4)]
>>> l = (i(0) + i(1) for a in alist)
<generator object <genexpr> at 0x10e60db90>
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> [x for x in l]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
File "<stdin>", line 1, in <lambda>
NameError: global name 'a' is not defined
Wenn Sie list(i(0) + i(1) for a in alist)
laufen Sie einen Generator (i(0) + i(1) for a in alist)
an die list
Klasse übergeben, die es versuchen, es zu konvertieren eine Liste in einem eigenen Umfang, bevor die Liste zurückgegeben wird. Für diesen Generator, der innerhalb der Lambda-Funktion keinen Zugriff hat, hat die Variable a
keine Bedeutung.
Das Generatorobjekt <generator object <genexpr> at 0x10e60db90>
hat den Variablennamen a
verloren. Wenn dann list
versucht, den Generator aufzurufen, löst die Lambda-Funktion einen Fehler für undefined a
aus.
Das Verhalten der Listenkomprehensionen im Gegensatz zu Generatoren erwähnt auch here:
List comprehensions also "leak" their loop variable into the surrounding scope. This will also change in Python 3.0, so that the semantic definition of a list comprehension in Python 3.0 will be equivalent to list(). Python 2.4 and beyond should issue a deprecation warning if a list comprehension's loop variable has the same name as a variable used in the immediately surrounding scope.
In python3:
>>> i = lambda x: a[x]
>>> alist = [(1, 2), (3, 4)]
>>> [i(0) + i(1) for a in alist]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
File "<stdin>", line 1, in <lambda>
NameError: name 'a' is not defined
es zeigt mir Fehler. –
@AvinashRaj Das Ausführen der zweiten Methode gibt zuerst 'NameError: globaler Name 'a' ist nicht definiert ' –
Dort liegt Ihr Problem, ein wird in der ersten als (3, 4) definiert, dann die list() -Funktion immer das 'a' – TheGeorgeous