Почему тип var изменяется при распаковке кортежа? - PullRequest
0 голосов
/ 13 февраля 2019

Рассмотрим этот пример:

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

Почему я получаю список вместо кортежа при распаковке кортежа с a, *b = t?

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Как описано в PEP 3132 , это расширенная повторяемая распаковка.Тип не «меняется»;только что определено, что * распаковка даст список во всех случаях.

Было предложено получить:

  • Кортеж вместо списка:

Сделать помеченную цель кортежем вместо списка.Это соответствовало бы *args функции, но усложняло бы дальнейшую обработку результата.

  • Тот же тип, что и с правой стороны:

Попробуйте присвоить помеченной цели тот же тип, что и для итерируемого источника, например, b в a, *b = 'hello' будет присвоена строка 'ello'.Это может показаться хорошим, но невозможно получить правильное согласование со всеми итерациями.

В конечном счете, эти предложения были отклонены.

Для получения дополнительной информации см. здесь и здесь .

0 голосов
/ 13 февраля 2019

В Python 3.0 в синтаксис множественного назначения добавлен оператор *, что позволяет нам захватывать оставшиеся элементы после распаковки в список.Оператор * позволяет нам заменять жестко закодированные фрагменты вблизи концов последовательностей.

Запись вашего кода:

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

Тот же код:

>>> t = (1, 2, 3)
>>> a, b, c = t
>>> a, b, c
(1, 2, 3)
>>> a, *b = t[0], t[1:]
>>> a, b
(1, [2, 3])

Подробнее здесь .

0 голосов
/ 13 февраля 2019

Вы можете найти больше информации по этой ссылке https://www.python.org/dev/peps/pep-3132/, но я думаю, что это в основном потому, что это универсальная итеративная распаковка, поэтому она сначала преобразует вещи в список для обработки в общем случае:

Кроме того, если правое значение не является списком, а является итеративным, его необходимо преобразовать в список, прежде чем можно будет выполнять нарезку

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...