【发布时间】:2019-06-25 23:11:36
【问题描述】:
在 Python 中,可变参数集合的工作方式似乎与序列解包在赋值语句中的工作方式完全不同。我试图了解这种可能令人困惑的差异的原因。我敢肯定有一个很好的理由,但它是什么?
# Example 1 with assignment statement
a, *b, c = 1,2,3,4
print(b) # [2, 3]
# Example 1 with function call
def foo(a, *b, c):
print(b)
foo(1,2,3,4)
函数调用导致如下错误:
Traceback (most recent call last):
File "<pyshell#309>", line 1, in <module>
foo(1,2,3,4)
TypeError: foo() missing 1 required keyword-only argument: 'c'
问题1:为什么b不赋值类似于赋值语句中的赋值方式?
# Example 2 with function call
def foo(*x):
print(x)
print(type(x))
foo(1,2,3) # (1, 2, 3) <class 'tuple'>
# Example 2 with assignment statement
a, *b, c = 1,2,3,4,5
print(b) # [2, 3, 4]
print(type(b)) # <class 'list'>
问题 2:为什么类型不同(列表 vs 元组)?
【问题讨论】:
-
你应该通读所有相关的PEPs 以找到解释,为什么 Python 功能会如此。
-
在函数中支持的格式是
func(a, b, *args, **kwargs),其中*args是一个元组,**kwargs是一个字典。您不能在可变参数*b之后添加位置参数c。位置参数用于 C 函数,并且有一个带有func(a,b,/)格式的 pep 用于在 python 代码上支持它 -
仅位置参数*
标签: python python-3.x