* _ и распаковка элементов из итераций произвольной длины в python - PullRequest
0 голосов
/ 06 сентября 2018
record= ('ACME', 50, 123.45, (12, 18, 2012))
name, *_, (*_, year) = record 
print(name)
>>>'ACME'
print (year)
>>> 2012
print (*_)
>>> 12 18

Итак, я начал читать о распаковке кортежей, списков и словарей. Он сказал

Иногда вам может понадобиться распаковать значения и выбросить их. Вы при распаковке не могу просто указать голый *, но вы можете использовать обычный одноразовое имя переменной, например _ или ign (игнорируется)

Я не совсем понял, поэтому я попытался понять, визуализировав мой код на pythontutor.com , но на самом деле он не «выбрасывал» значения, присвоенные * _, также я не могу получить доступ к данным "50, 123,45". Я только начинаю, поэтому, пожалуйста, потерпите меня, потому что мне трудно это понять.

1 Ответ

0 голосов
/ 06 сентября 2018

«Использовать общее одноразовое имя переменной» - это ключ. *_ распаковывает (*) в переменную с именем _. Единственное, что делает _ «отбрасывающим», это то, что оно обычно игнорируется. Однако, если вы не проигнорируете это, это не будет броском!

Если вы хотите распаковать несколько частей и по-прежнему иметь доступ к ним по отдельности, используйте разные имена переменных. Ваш пример:

>>> record= ('ACME', 50, 123.45, (12, 18, 2012))
>>> name, *_, (*_, year) = record
>>> print(name,year,*_)
ACME 2012 12 18

назначает переменную _ дважды, поэтому назначенные позже данные 12,18 перезаписывают ранее назначенные данные 50,123.45. Для сравнения рассмотрим:

>>> name, *_a, (*_b, year) = record
>>> print(*_a)
50 123.45                 <-- the data you mentioned
>>> print(*_b)
12 18

В этом примере _a и _b - это отдельные переменные, которые содержат отдельное содержимое. Задание

name, *_a, (*_b, year) = record

точно так же, как

name, *extra1, (*extra2, year) = record

но с разными именами. Опять же, ничего о _ само по себе не является волшебным.

...