Пытаюсь понять *args в python

Я читаю о *args и **kwargs в Python и экспериментирую с REPL:

varX, *varY = [99, 100, 101]

Я ожидал, что varX будет [99, 100, 101], но этого не произошло. Вместо этого я получаю это:

print(varX)
# 99

Хм? Ну тогда что такое varY?

print(varY)
# [100, 101]

Получение списка имеет смысл, но я думал, что в нем будет три значения, а не два.

print(*varY)
# 100 101

По крайней мере, это имеет смысл для меня, основываясь на всем, что произошло раньше. Итак, мой большой вопрос: почему Python (3.6) делает исходные назначения таким образом?


person Alan W.    schedule 02.08.2018    source источник
comment
Это называется распаковка. Вы распаковываете одно значение в varX, а затем используете оператор *splat для распаковки всего остального в varY. Вы также можете использовать x, y, z = [1,2,3] для распаковки каждого значения списка в каждую из ваших трех переменных.   -  person user3483203    schedule 02.08.2018
comment
См. PEP, представляющий эту функцию, здесь: python.org/dev/peps/pep-3132.   -  person Patrick Haugh    schedule 02.08.2018
comment
Интересный. Ваше название и введение не имеют ничего общего с сутью вопроса. Различные виды распаковки.   -  person Mad Physicist    schedule 02.08.2018
comment
Ожидал вопроса о функциях, когда увидел заголовок   -  person Adarsh Chavakula    schedule 02.08.2018
comment
Должен сказать, дуп-хаммер приятный. Пожалуйста, дайте мне знать, если в дубликате отсутствует что-то из того, что вы хотите знать.   -  person Mad Physicist    schedule 02.08.2018


Ответы (1)


Чтобы расширить то, что @user3483203 пытается сказать - с некоторыми примерами. Вы можете упаковывать и упаковывать кортежи в одну переменную или распаковывать кортеж в несколько переменных.

Скажем, у вас есть t = (1, 2, 3, 4, 5), вы можете распаковать его с помощью v, w, x, y, z = t, это назначит каждый соответствующий индекс возвращаемой переменной, поэтому v = 1, w = 2 и так далее. Это называется распаковкой: «вы распаковываете t в v, w, x, y, z. Вы также можете упаковать переменные вместе. Допустим, у вас есть v = 1, w = 2, x = 3, y = 4, z = 5, вы можете сделать следующее t = [v, w, x, y, z].

Это всего лишь краткое объяснение упаковки и распаковки.

person Ely Fialkoff    schedule 02.08.2018
comment
А что со сплатом? Кроме того, технически верно для всех итераций, а не только для кортежей. Работает даже для генераторов. - person Mad Physicist; 02.08.2018
comment
Я не использовал *splat, поэтому не могу комментировать. - person Ely Fialkoff; 02.08.2018
comment
Ах, но вот в чем вопрос. - person Mad Physicist; 02.08.2018