2

为什么这行得通?

尽管函数定义了关键字参数,但函数test接受位置参数。

>>> def test(a=[]):
...  print(a)
... 
>>> test([1,2,3])
[1, 2, 3]
4

2 回答 2

2

在 Python 中 *args 和 / ( PEP570 ) 之前的参数可以用作位置参数和关键字参数。在您的情况下,您必须这样编写才能强制 geta作为关键字参数。

>>> def test(*args,a=[]):
...  print(a)
... 
>>> test([1,2,3])
[]
>>> test(a=[1,2,3])
[1, 2, 3]

有关更多信息,您可以阅读此 python文档

于 2020-05-20T21:28:28.760 回答
2

如果您在调用中不提供关键字,则它基本上只是一个位置参数(例如顺序很重要),但如果您不提供值,则具有默认值。但是, * 可以像 in 一样test_2用于强制执行仅关键字参数。

def test_1(a=[], b=1): print(f'a = {a}, b = {b}')
def test_2(*, a=[]): print(a)
def test_3(x, y): print(x, y) 

test_1([1, 2, 3])
a = [1, 2, 3], b = 1

test_1(2, [1, 2, 3]) 
a = 2, b = [1, 2, 3]  # order of arguments matter.

test_1(b=2, a=[1, 2, 3])
a = [1, 2, 3], b = 2 # order of arguments does not matter.

test_2('a') 
test_2() takes 0 positional arguments but 1 was given

test_3(y='a', x='b') # order does not matter                                                                                                                                                           
b a

test_3('a', 'b') # order matters                                                                                                                                                      
a b

更新(以防有人通过谷歌搜索或其他方式来到这里):

参数=/=参数

于 2020-05-20T20:55:36.123 回答