【问题标题】:Python unpacking operator (*)Python 解包运算符 (*)
【发布时间】:2018-11-29 17:35:27
【问题描述】:

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

*s,='abcde'

我知道解包操作符基本上是迭代一个序列。所以我知道

s=[*'abcde']

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

谁能详细解释一下

*s,='abcde'

声明工作?我知道它与s=[*'abcde'] 做同样的事情,但它以不同的方式完成它。为什么解包迭代器是变量而不是字符串?为什么变量名后面有个逗号?

【问题讨论】:

  • 我对这是否与Star * operator on left vs right side of an assignment statement 重复存在冲突。无论如何,答案应该会有所帮助。
  • @miradulo 我阅读了这个问题及其答案,有些事情已经弄清楚了。尽管如此,我仍然对变量名后逗号的使用感到困惑。这是否与 s 将成为列表这一事实有关?
  • @machetazo 以便在 lhs 上使用 * - lhs 需要是逗号分隔列表或 [ ]。尾随逗号创建一个仅包含一项的逗号分隔列表,相当于 [*s]='abcde',但这是多了一个字符。

标签: python python-3.x operators


【解决方案1】:

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

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

【讨论】:

  • PEP 3132 执行:“简单赋值左侧的元组(或列表)...”
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    相关资源
    最近更新 更多