В Python можно сделать:
a, b = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
Я проверил сгенерированный байт-код с помощью dis
, и они идентичны.
Так зачем вообще это допускать? Будет ли мне когда-нибудь один из них вместо остальных?
В Python можно сделать:
a, b = 1, 2
(a, b) = 1, 2
[a, b] = 1, 2
Я проверил сгенерированный байт-код с помощью dis
, и они идентичны.
Так зачем вообще это допускать? Будет ли мне когда-нибудь один из них вместо остальных?
Один случай, когда вам нужно включить больше структуры в левой части задания, - это когда вы попросите 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')
Кортежи 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)
Кажется, что нет причин, позволяющих также использовать квадратные скобки, и люди редко делают.
Они также одинаковы, потому что назначение происходит справа налево и справа, у вас есть один тип, который представляет собой последовательность из двух элементов. Когда вызов назначается, последовательность распаковывается и ищет соответствующие элементы, которые соответствуют и даются этим значениям. Да, любой способ должен быть хорошим в этом случае, когда последовательность распаковывается в соответствующие элементы.
Открытая скобка позволяет назначать многострочные строки. Например, при чтении строки из csv.reader()
он делает код более читаемым (если менее эффективным) для загрузки списка в именованные переменные с одним присваиванием.
Начиная со скобки, избегает длинных или \
экранированных строк.
(a, b,
c) = [1, 2, 3]
(Представьте, что все больше и больше имен переменных)
При распаковке одноэлементного итерабельного синтаксиса списка лучше:
a,=f() # comma looks out of place
(a,)=f() # still odd
[a]=f() # looks like every other list