Автор: CoolPython
Уверена, что множественное присваивание в Python видели все. Выглядит оно вот так:
>>> x, y, z = 1, 2, 3 >>> x 1 >>> z 3
На самом деле на низком уровне создается tuple и в цикле инициализируется значениями 1, 2, 3. Поэтому с тем же успехом можно не опускать скобки и написать вот так:
>>> (x, y, z) = (1, 2, 3) >>> x 1 >>> z 3
И это тоже сработает. Поэтому множественное присваивание еще называют tuple unpacking. Да и чаще всего его, кажется, используют именно с кортежами. Но вообще так можно писать с любыми iterable типами:
>>> x, y = [1, 2] >>> y 2
И со строками тоже:
>>> x, y = 'hi' >>> x 'h' >>> y 'i'
Множественное присваивание, если применять его с оператором *
, позволяет делать еще вот такие крутые штуки:
>>> numbers = [1, 2, 3, 4, 5, 6] >>> first, *rest = numbers >>> first 1 >>> rest [2, 3, 4, 5, 6]
По сути *
здесь заменяет слайсы. С тем же успехом можно было написать:
>>> first, last = numbers[0], numbers[1:] >>> first 1 >>> last [2, 3, 4, 5, 6]
Но через распаковку получается читаемее. Можно даже «вырезать» середину:
>>> first, *middle, last = numbers
И если вам не нужны все промежуточные индексы, то хороший тон это вообще использовать нижнее подчеркивание:
>>> first, *_, last = [1, 2, 3, 4, 5, 6]
Кстати, если речь о вложенных объектах, то обратите внимание, что копия будет глубокой:
>>> color, point = ('blue', (0, 0, 255)) >>> color 'blue' >>> point (0, 0, 255)
В некоторых случаях это очень удобно.
В общем, множественное присваивание можно использовать не только с кортежами, но и со списками, строками и любыми iterable типами. Его плюс в том, что оно позволяет не использовать индексы, а значит, уменьшает склонность к ошибкам и делает код читаемее. А еще оно используется в args, kwargs
-синтаксисе, который часто смущает начинающих, но об этом в следующий раз.