Почему python по-разному трактует звездочку в функциях и выражениях? - PullRequest
0 голосов
/ 21 октября 2018

В следующих кодах есть два места, где используется звездочка (*):

Звездочка в функции:

def function(*asterisk):
    print(1, type(asterisk))

Звездочка в выражениях:

a, *b = (1, 2, 3)
print(2, type(b))

a, *b = [1, 2, 3]
print(3, type(b))

Я знаю значение звездочки в функциях и как она работает.

Мой вопрос заключается в том, почему звездочка в печати № 1 имеет тип tuple , тогда как в печати № 2 и 3 - список тип?

Почему python интерпретирует параметр * функции как кортеж независимо от типа аргумента и интерпретирует * переменную как список независимо от типа присвоенных чисел в выражениях?

В конце концов, это * разные операторы?!

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Разработчики только что выяснили, что список будет легче обрабатывать в случае назначения.Цитируя синтаксис PEP для a, *b = ...:

После короткого обсуждения списка python-3000 [1] , PEP был принят Гвидов его нынешнем виде.Обсуждались следующие возможные изменения:

  • ...

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

И обсуждение списка рассылки :

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

Обсуждение списка рассылки довольно короткое ( начинается здесь ,только 28 сообщений), так что не бойтесь читать все это целиком.

0 голосов
/ 21 октября 2018

Распаковка в назначении (специфично для Python 3): расширенная итеративная распаковка (когда термин распаковки относится к правой стороне , переменная, которая следует * слевасторона не распакована, но создана ), тогда как другая (также доступная в python 2) - просто распаковка позиционного аргумента.

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

При распаковке параметров лучше иметь фиксированную итерацию, например tuple.Еще раз, это совершенно разные механизмы.

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