* _和从python中任意长度的可迭代元素中解包元素

时间:2018-09-06 16:59:35

标签: python list tuples naming-conventions iterable-unpacking

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 :(得分:2)

“使用通用的一次性变量名称”是个线索。 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 正在将(*_)解压缩到名为*的变量中。使_被“抛弃”的唯一原因是通常将其忽略。但是,如果您不忽略它,那将不会是一掷千金!

如果要拆开多个包装,并且仍然能够分别访问它们,请使用不同的变量名称。您的示例:

_

两次分配变量>>> 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 本身没有什么神奇的东西。