2010-09-27 5 views
0

Je reçois une erreur: name 'i' is not definedQuelle est la bonne façon d'écrire cette liste de compréhension?

k = [ [ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) ] 
    for j in range(0,len(furs[i])) ] 

mais

k = [ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) 
    for j in range(0,len(furs[i])) ] 

fonctionne étonnamment!

EDIT: Quelle est la bonne façon de les écrire? J'essaie de générer une matrice 2D avec i comme itérateur pour la boucle externe & j comme itérateur pour la boucle interne.

Répondre

1

Regardez attentivement la deuxième for boucle: for j in range(0,len(furs[i])). Vous faites ici référence à i même s'il est créé et utilisé dans la première liste de compréhension précédente ([ rids[i][j][0]['a'] * rids[i][j][1]['b'] for i in range(0,10) ]). Le i est limité à la portée de cette première compréhension; de ce fait, il n'est pas visible à la seconde compréhension. Par conséquent, vous obtenez l'erreur.

La deuxième variante fonctionne car les deux i et j sont déclarés et utilisés dans la même compréhension de liste. Laissez-nous simplifier un peu l'extrait de code pour simplifier l'extrait de code. Essayez ceci:

>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 

Traceback (most recent call last): 
    File "<pyshell#35>", line 1, in <module> 
    [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 
NameError: name 'i' is not defined 
>>> 

Maintenant, combinons les compréhensions, apportant ainsi i et j dans la même portée:

>>> [ i * j for i in range(0,10) for j in range(0, i) ] 
[0, 0, 2, 0, 3, 6, 0, 4, 8, 12, 0, 5, 10, 15, 20, 0, 6, 12, 18, 24, 
30, 0, 7, 14, 21, 28, 35, 42, 0, 8, 16, 24, 32, 40, 48, 56, 0, 9, 
18, 27, 36, 45, 54, 63, 72] 
>>> 

maintenant (effronté = P) essayer à nouveau la première compréhension:

>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18], [0, 3, 6, 9, 12, 15, 18, 21, 24, 27], 
[0, 4, 8, 12, 16, 20, 24, 28, 32, 36], [0, 5, 10, 15, 20, 25, 30, 35, 40, 45], 
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54], [0, 7, 14, 21, 28, 35, 42, 49, 56, 63], 
[0, 8, 16, 24, 32, 40, 48, 56, 64, 72]] 
>>> 

Ta da! Cela fonctionne mais donne résultat différent. Pourquoi cela est-il ainsi? La raison en est que la (dernière) valeur de i est disponible dans la portée la plus externe après l'exemple deux. Autrement dit, les variables créées à l'intérieur d'une liste de compréhension sont disponibles dans la portée REPL.

(PS: Je crois que le paragraphe ci-dessus peut être reformulé meilleurs Pythoneux ici, s'il vous plaît aider.)

Pour vérifier cela, essayez de supprimer i et exécutez l'exemple 3 à nouveau.

>>> del i 
>>> [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 

Traceback (most recent call last): 
    File "<pyshell#41>", line 1, in <module> 
    [ [ i * j for i in range(0,10) ] for j in range(0, i) ] 
NameError: name 'i' is not defined 
>>> 

Et nous sommes de retour à la case départ.

1

for j in range(0,len(furs[i])) dans votre premier exemple: i n'est pas dans la portée ici, en raison du précédent ].

0

k = [ [ rids[i][j][0]['a'] * rids[i][j][1]['b']
for i in range(0,10) ] for j in range(0,len(furs[i])) ]
Dans l'instruction ci-dessus, je n'existe que jusqu'à la première ] et je suis hors de portée après cela.

Questions connexes