* _和从python中的任意长度的Iterables解包元素

问题描述 投票:2回答:1
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”。我刚刚开始,所以请耐心等待我,因为我很难理解这一点。

python list tuples naming-conventions iterable-unpacking
1个回答
2
投票

“使用常见的一次性变量名称”是线索。 *_正在拆包(*)成为一个名为_的变量。使_“一次性”的唯一因素是它通常被忽略。但是,如果你不忽视它,它将不是一次性的!

如果要解压缩多个部分,并且仍然可以单独访问它们,请使用不同的变量名称。你的例子:

>>> 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

但名字不同。再一次,没有任何关于_本身是神奇的。

© www.soinside.com 2019 - 2024. All rights reserved.