f
期望 3 个参数(x
, y
, z
, 按此顺序)。
假设L = [1,2]
。当你调用f(3, *L)
时,python 在幕后所做的就是调用f(3, 1, 2)
,而不知道L
.
那么如果L
是会发生什么[1,2,3]
呢?
然后,当您调用 时f(3, *L)
,您最终会调用f(3,1,2,3)
,这将是一个错误,因为f
期望正好有 3 个参数,而您给了它 4 个。
现在,假设L=[1,2]1. Look at what happens when you call
f`:
>>> f(3,*L) # works fine
>>> f(*L) # will give you an error when f(1,2) is called; insufficient arguments
现在,您隐含地知道何时调用f(*L, 3)
3 将分配给z
,但 python 不知道这一点。它只知道j
输入 to 的最后许多元素f
将由L
. 但由于它不知道 的值len(L)
,它无法假设是否f(*L,3)
会有正确数量的参数。
然而,情况并非如此f(3,*L)
。在这种情况下,python 知道除了第一个参数之外的所有参数都将由L
.
但是,如果您已命名 arguments f(x=1, y=2, z=3)
,则按名称分配的参数将首先被绑定。只有这样才能绑定位置参数。所以你做f(*L, z=3)
。在这种情况下,z
首先绑定3
,然后绑定其他值。
现在有趣的是,如果你这样做了f(*L, y=3)
,那会给你一个尝试分配y
两次的错误(一次是关键字,一次是位置)
希望这可以帮助