En réponse à l'article écrit par @buchio Python lambda est inutile ^ H ^ H ^ H ^ H ^ H difficile à utiliser regarder.
Il est facile de comprendre la variable locale si vous pensez que la zone est réservée derrière elle. La référence dans le lambda est la zone, pas la valeur de la variable (visible au moment de la définition). En d'autres termes, test1 dans l'article d'origine est équivalent au code ci-dessous.
>>> def test1_aux():
... env = [None]
... funcs = []
... for i in range(10):
... env[0] = i
... funcs.append(lambda a: a+env[0])
... return funcs
...
>>> print [f(10) for f in test1_aux()]
[19, 19, 19, 19, 19, 19, 19, 19, 19, 19]
Le fait que la portée de la variable i ne se limite pas à l'intérieur de l'instruction for est certainement un peu déroutant, mais je ne pense pas qu'il y ait autre chose d'étrange à ce sujet.
À propos, pour la notation d'inclusion de liste, qui est étroitement liée à l'instruction for, les variables ne peuvent plus être référencées à partir de la portée externe de Python 3.
python2
>>> [x for x in range(3)]
[0, 1, 2]
>>> x
2
python3
>>> [x for x in range(3)]
[0, 1, 2]
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
En Python, vous pouvez l'appeler en implémentant la méthode \ _ \ _ call \ _ \ _ dans n'importe quelle classe. Ainsi, vous pouvez utiliser l'objet là où vous avez besoin de la fermeture.
>>> class Adder(object):
... def __init__(self, i):
... self.i = i
... def __call__(self, a):
... return a + self.i
...
>>> def test_callable():
... funcs = []
... for i in range(10):
... funcs.append(Adder(i))
... return funcs
...
>>> print [f(10) for f in test_callable()]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
En Python, l'utilisation de fonctions et d'objets est plus lisible et plus simple, il est donc plus pythonique d'utiliser des lambdas pour autre chose que de simples expressions.
Recommended Posts