web-dev-qa-db-fra.com

Sémantique d'affectation 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? Aurais-je jamais besoin de l'un d'eux au lieu des autres?

66
Aillyn

Un cas où vous devez inclure plus de structure sur le côté gauche de l'affectation est lorsque vous demandez Python décompressez une séquence légèrement plus compliquée. 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 s'est avéré utile pour moi dans le passé, par exemple, lors de l'utilisation d'énumération pour itérer sur 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')
74
Will McCutchen

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

a = 1, 2, 3

est équivalent à

a = (1, 2, 3)

Dans certains cas, vous avez besoin de parenthèses pour résoudre les ambiguïtés, par exemple si vous voulez passer le Tuple (1, 2) À la fonction f, vous devrez écrire f((1, 2)). Parce que les parenthèses sont parfois nécessaires, elles sont toujours autorisées pour la cohérence, tout comme vous pouvez toujours écrire (a + b) Au lieu de a + b.

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

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

Il ne semble pas y avoir de raison d'autoriser également les crochets, et les gens le font rarement.

13
Sven Marnach

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'attribution est effectué, la séquence est décompressée et a recherché les éléments correspondants à faire correspondre et donnés à ces valeurs. Oui, n'importe quelle façon devrait convenir dans ce cas où la séquence est décompressée vers les éléments respectifs.

2
Senthil Kumaran

Lors du déballage d'un élément unique itérable, la syntaxe de la liste est plus jolie:

a,=f()    # comma looks out of place
(a,)=f()  # still odd
[a]=f()   # looks like every other list
2
Davis Herring

Une parenthèse ouverte permet une affectation sur plusieurs lignes. Par exemple, lors de la lecture d'une ligne à partir de csv.reader(), cela rend le code plus lisible (si moins efficace) pour charger la liste dans des variables nommées avec une seule affectation.

Commencer par une parenthèse évite les longs ou \ lignes échappées.

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

(Imaginez des noms de variables plus nombreux et plus longs)

0
verbamour