70 votes

Sémantique d'assignation multiple

En Python, on peut faire:

 a, b   = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
 

J'ai vérifié le bytecode généré en utilisant dis et ils sont identiques.
Alors pourquoi permettre cela du tout? Aurais-je jamais besoin de l'un d'eux au lieu des autres?

76voto

Will McCutchen Points 8193

Par exemple, lorsque vous demandez à Python de décompresser une séquence légèrement plus compliquée, vous devez inclure plus de structure dans la partie gauche de la tâche. Par exemple:

 # Works
>>> a, (b, c) = [1, [2, 3]]

# Does not work
>>> a, b, c = [1, [2, 3]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: need more than 2 values to unpack
 

Cela m’a été utile dans le passé, par exemple, lorsqu’on utilisait énumération pour parcourir une séquence de 2-tuples. Quelque chose comme:

 >>> d = { 'a': 'x', 'b': 'y', 'c': 'z' }
>>> for i, (key, value) in enumerate(d.iteritems()):
...     print (i, key, value)
(0, 'a', 'x')
(1, 'c', 'z')
(2, 'b', 'y')
 

13voto

Sven Marnach Points 133943

Python tuples peuvent souvent être écrite avec ou sans les parenthèses:

a = 1, 2, 3

est équivalent à

a = (1, 2, 3)

Dans certains cas, vous avez besoin des parenthèses pour résoudre les ambiguïtés, par exemple, si vous voulez passer le tuple (1, 2) à la fonction f, vous aurez à rédiger f((1, 2)). Parce que les parenthèses sont parfois nécessaires, ils sont toujours autorisés pour des raisons de cohérence, tout comme vous pouvez toujours écrire (a + b) au lieu de a + b.

Si vous souhaitez décompresser d'une séquence imbriquée, vous avez également besoin des parenthèses:

a, (b, c) = 1, (2, 3)

Il ne semble pas être une raison pour permettre à des crochets, et les gens font rarement.

2voto

Senthil Kumaran Points 14934

Ils sont également identiques car l’affectation se fait de droite à gauche et à droite, vous avez un type, qui est une séquence de deux éléments. Lorsque l'appel d'affectation est effectué, la séquence est décompressée et recherche les éléments correspondants à associer et donnés à ces valeurs. Oui, n'importe quelle méthode devrait convenir dans le cas où la séquence est décompactée en éléments respectifs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X