Python解包运算符(*)

时间:2018-06-20 14:31:18

标签: python python-3.x operators

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

*s,='abcde'

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

s=[*'abcde']

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

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

*s,='abcde'

陈述工作?我知道它的作用与s=[*'abcde']相同,但是它以不同的方式完成它。为什么将解包迭代器放在变量而不是字符串上?为什么变量名后面会出现逗号?

2 个答案:

答案 0 :(得分:5)

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

a, b, c = [1, 2, 3]

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

a, *b, c = [1, 2, 3, 4, 5]
print(b)
# [2, 3, 4]

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

*s='abcde'

您会得到

SyntaxError: starred assignment target must be in a list or tuple

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

答案 1 :(得分:1)

仅需使用尾部逗号才能创建单个元组(也称为单例);在所有其他情况下,它是可选的。没有尾部逗号的单个表达式不会创建元组,而是产生该表达式的值。