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?
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')
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.
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.
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
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)