Python解包运算符(*)

mac*_*azo 3 python operators python-3.x

我正在研究python codegolf,看到有人以一种奇怪的方式使用拆包运算符:

*s,='abcde'
Run Code Online (Sandbox Code Playgroud)

我知道解包运算符基本上是对一个序列进行迭代。所以我知道

s=[*'abcde']
Run Code Online (Sandbox Code Playgroud)

将“解压” abcde字符串并保存['a', 'b', 'c', 'd', 'e']在variable中s

有人可以尽可能详尽地解释

*s,='abcde'
Run Code Online (Sandbox Code Playgroud)

声明工作?我知道它的作用与之相同,s=[*'abcde']但它以不同的方式实现。为什么将解包迭代器放在变量而不是字符串上?为什么在变量名后面有一个逗号?

Pat*_*ugh 7

这是可重复拆包。您可能已经在其他地方看到过,它可以从单个表达式为多个变量赋值

a, b, c = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

此语法包含一个*,指示该变量应该是一个列表,其中包含未明确分配给另一个变量的可迭代元素。

a, *b, c = [1, 2, 3, 4, 5]
print(b)
# [2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

那么,您的示例中发生了什么?仅分配了一个变量名,因此它将采用所有未分配给另一个变量的项目,在这种情况下,它们都是全部。如果你只是尝试

*s='abcde'
Run Code Online (Sandbox Code Playgroud)

你会得到

SyntaxError: starred assignment target must be in a list or tuple
Run Code Online (Sandbox Code Playgroud)

这就是为什么使用逗号的原因,因为尾随逗号是您表示单值元组的方式。

  • [PEP 3132](https://www.python.org/dev/peps/pep-3132/#specification)会:“在简单分配的左侧有一个元组(或列表)...” (3认同)