L' for
boucle suit les règles standard de cession, de sorte que ce qui fonctionne sur la GAUCHE de la vanille, une affectation de travail avec l' for
:
Chaque élément est attribué à la liste des cibles à l'aide de la norme
règles pour les affectations
L' for
construire simplement invoque le mécanisme sous-jacent de l'attribution à la cible, qui dans le cas de votre exemple de code est - STORE_SUBSCR
:
>>> foo = [42]
>>> k = {'c': 'd'}
>>> dis.dis('for k["e"] in foo: pass')
1 0 SETUP_LOOP 16 (to 18)
2 LOAD_NAME 0 (foo)
4 GET_ITER
>> 6 FOR_ITER 8 (to 16)
8 LOAD_NAME 1 (k)
10 LOAD_CONST 0 ('e')
12 STORE_SUBSCR <--------------------
14 JUMP_ABSOLUTE 6
>> 16 POP_BLOCK
>> 18 LOAD_CONST 1 (None)
20 RETURN_VALUE
Mais à ma grande surprise, ce n'était pas une erreur de syntaxe
Apparemment, tout ce qui fonctionne dans une affectation régulière telle que la suivante:
plein de tranche d'affectation:
>>> for [][:] in []:
... pass
...
>>>
liste d'abonnement
>>> for [2][0] in [42]:
... pass
...
>>>
dictionnaire d'abonnement etc. serait candidat valide les objectifs fixés, à la seule exception étant enchaînés affectation; bien que, je pense secrètement qu'on peut cuire jusqu'à quelques sale syntaxe pour effectuer le chaînage.
Je m'attends à ce que seul les identifiants et les tuples d'identifiants
Je ne peux pas penser à un bon cas d'utilisation d'un dictionnaire clé en tant que cible. En outre, il est plus lisible de faire le dictionnaire de l'affectation de la touche dans le corps de la boucle, de l'utiliser comme une cible dans l' for
de la clause.
Toutefois, l'étendue de déballage (Python 3) qui est très utile dans les tâches régulières, est également livré également à portée de main dans une boucle for:
>>> lst = [[1, '', '', 3], [3, '', '', 6]]
>>> for x, *y, z in lst:
... print(x,y,z)
...
1 ['', ''] 3
3 ['', ''] 6
Le mécanisme correspondant pour l'affectation à des cibles différentes, ici, est également convoqué; plusieurs STORE_NAME
s:
>>> dis.dis('for x, *y, z in lst: pass')
1 0 SETUP_LOOP 20 (to 22)
2 LOAD_NAME 0 (lst)
4 GET_ITER
>> 6 FOR_ITER 12 (to 20)
8 EXTENDED_ARG 1
10 UNPACK_EX 257
12 STORE_NAME 1 (x) <-----
14 STORE_NAME 2 (y) <-----
16 STORE_NAME 3 (z) <-----
18 JUMP_ABSOLUTE 6
>> 20 POP_BLOCK
>> 22 LOAD_CONST 0 (None)
24 RETURN_VALUE
Pour montrer qu'un for
est à peine une simple affectation des instructions exécutées successivement.