Подтвердить что ты не робот

Множественная семантика присваивания

В Python можно сделать:

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

Я проверил сгенерированный байт-код с помощью dis, и они идентичны.
Так зачем вообще это допускать? Будет ли мне когда-нибудь один из них вместо остальных?

4b9b3361

Ответ 1

Один случай, когда вам нужно включить больше структуры в левой части задания, - это когда вы попросите Python распаковать несколько более сложную последовательность. Например:.

# 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

Это оказалось полезным для меня в прошлом, например, при использовании перечисления для итерации по последовательности из 2-х кортежей. Что-то вроде:

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

Ответ 2

Кортежи Python часто могут быть записаны с круглыми скобками или без них:

a = 1, 2, 3

эквивалентно

a = (1, 2, 3)

В некоторых случаях вам нужны скобки для устранения неоднозначностей, например, если вы хотите передать кортеж (1, 2) в функцию f, вам нужно написать f((1, 2)). Поскольку иногда нужны скобки, они всегда допускаются для согласованности, так же, как вы всегда можете написать (a + b) вместо a + b.

Если вы хотите распаковать вложенную последовательность, вам также нужны скобки:

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

Кажется, что нет причин, позволяющих также использовать квадратные скобки, и люди редко делают.

Ответ 3

Они также одинаковы, потому что назначение происходит справа налево и справа, у вас есть один тип, который представляет собой последовательность из двух элементов. Когда вызов назначается, последовательность распаковывается и ищет соответствующие элементы, которые соответствуют и даются этим значениям. Да, любой способ должен быть хорошим в этом случае, когда последовательность распаковывается в соответствующие элементы.

Ответ 4

Открытая скобка позволяет назначать многострочные строки. Например, при чтении строки из csv.reader() он делает код более читаемым (если менее эффективным) для загрузки списка в именованные переменные с одним присваиванием.

Начиная со скобки, избегает длинных или \ экранированных строк.

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

(Представьте, что все больше и больше имен переменных)

Ответ 5

При распаковке одноэлементного итерабельного синтаксиса списка лучше:

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