python-3.x 单独解包元组以进行字符串格式化时,带星号的表达式出现语法错误

afdcj2ne  于 2023-02-17  发布在  Python
关注(0)|答案(3)|浏览(125)

我在Python 3.5.2中使用REPL做了如下尝试:

>>> a = (1, 2)
>>> '%d %d %d' % (0, *a)
'0 1 2'
>>> '%d %d %d' % (*a, 3)
'1 2 3'
>>> '%d %d' % (*a)
  File "<stdin>", line 1
SyntaxError: can't use starred expression here
>>>

我的问题是为什么
用更严肃的语气说:我想要一个答案,或者一个参考,详细说明使用星号表达式的所有细节,因为我有时会对它的行为感到惊讶...

附录

为了反映紧随我的问题之后的一些启发性评论,我添加了以下代码

>>> '%d %d' % (, *a)
  File "<stdin>", line 1
    '%d %d' % (, *a)
               ^
SyntaxError: invalid syntax
>>> '%d %d' % (*a,)
'1 2'
>>>

(在发布最初的问题之前,我已经尝试了(, a)部分,但我忽略了它,因为错误与主演无关。)
在python ≥ 3.5中,有一个语法"只是工作",但我仍然希望得到一些理解。

qni6mghb

qni6mghb1#

出现这个错误是因为(a)只是一个用括号括起来的值,它不是一个新的元组对象。
因此,'%d %d' % (*a)等同于'%d %d' % * a,这在python语法方面显然是错误的。
要创建一个新的元组,使用一个表达式作为初始化器use a comma after that expression

>>> '%d %d' % (*a,)
'1 2'

当然,由于a已经是元组,我们可以直接使用它:

>>> '%d %d' % a
'1 2'
guykilcj

guykilcj2#

我的问题是为什么
因为你的python语法不允许这样做,它就是这样定义的,所以没有真正的"为什么"。
而且也没必要。

"%d %d" % a

会起作用。
因此,您需要将扩展转换为元组-正如Lafexlos所指出的,正确的方法是

"%d %d" % (*a,)
gpfsuwkq

gpfsuwkq3#

这是因为:

>>> '%d %d' % (*a)

可以只是:

>>> '%d %d' %a

当然然后能够做到:

>>> '%d %d' % (*a,)

但随后:

>>> (*a,)==a
True
>>>

或者您可以执行以下操作:

>>> '%d %d' % [*a]

但随后:

>>> [*a]
[1, 2]
>>> a
(1, 2)
>>>

因此:

>>> tuple([*a])==a
True

相关问题