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 callf`:
>>> 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两次的错误(一次是关键字,一次是位置)
希望这可以帮助