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

*_ and Unpacking Elements from Iterables of Arbitrary Length in python

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

所以我开始阅读有关拆包元组、列表和字典的内容。它说

Sometimes you might want to unpack values and throw them away. You can’t just specify a bare * when unpacking, but you could use a common throwaway variable name, such as _ or ign(ignored)

我不太明白,所以我试图通过在 pythontutor.com 上可视化我的代码来理解,但它并没有真正 "throwaway" 分配给 *_ 的值,我也无法理解访问数据“50, 123.45”。我才刚刚开始,所以请耐心等待,因为我很难理解这一点。

"Use a common throwaway variable name" 是线索。 *_ 正在将 (*) 解包到名为 _ 的变量中。唯一使 _ "throwaway" 的是它通常被忽略。不过,你不理它,它就不会被扔掉!

如果你想解包多个部分,并且仍然能够分别访问它们,请使用不同的变量名。你的例子:

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

但名称不同。同样,_ 本身并没有什么神奇之处。