f
prevede 3 argomenti (x
, , z
, in questo ordine).
Supponiamo L = [1,2]
. Quando chiami f(3, *L)
, ciò che Python fa dietro le quinte, è quello di chiamare f(3, 1, 2)
, senza conoscere davvero la lunghezza di L
.
Quindi cosa succede se lo L
era invece [1,2,3]
?
Poi, quando si chiama f(3, *L)
, si finirà per chiamare f(3,1,2,3)
, che sarà un errore perché f
si aspetta esattamente 3 argomenti e si diede 4.
Ora, supponiamo 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
Ora, è implicitamente sa quando si chiama f(*L, 3)
che saranno assegnati a z
3, ma Python non lo sa. Sa solo che gli ultimi j
elementi dell'input a f
saranno definiti dal contenuto di L
. Ma dal momento che non conosce il valore di len(L)
, non può fare ipotesi sul fatto che f(*L,3)
abbia il numero corretto di argomenti.
Tuttavia, questo non è il caso di f(3,*L)
. In questo caso, python sa che tutti gli argomenti TRANNE il primo saranno definiti dal contenuto di L
.
Tuttavia, se sono stati denominati argomenti f(x=1, y=2, z=3)
, gli argomenti a cui viene assegnato il nome verranno prima associati. Solo allora gli argomenti posizionali sono vincolati. Così fai f(*L, z=3)
. In tal caso, z
è associato prima a 3
e quindi gli altri valori vengono associati.
Ora è interessante notare che, se l'avete fatto f(*L, y=3)
, che darebbe un errore per cercare di assegnare al y
due volte (una volta con la parola chiave, ancora una volta con la posizionale)
Spero che questo aiuti
'f (* a, 3)' ora funziona in Python 3.5 –