Chcę dodać jeszcze jedną odpowiedź:
Dzieje się tak, gdy próbujesz przekazać parametr pozycyjny z niewłaściwą kolejnością pozycji wraz z argumentem słowa kluczowego w wywołaniu funkcji.
there is difference between parameter and argument
możesz przeczytać szczegółowo o Argumentach i parametrach w Pythonie
def hello(a,b=1, *args):
print(a, b, *args)
hello(1, 2, 3, 4,a=12)
ponieważ mamy trzy parametry:
a jest parametrem pozycyjnym
b = 1 to słowo kluczowe i parametr domyślny
* args to parametr o zmiennej długości
więc najpierw przypisujemy jako parametr pozycyjny, co oznacza, że musimy podać wartość argumentowi pozycyjnemu w jego kolejności pozycji, tutaj kolejność ma znaczenie. ale przekazujemy argument 1 w miejscu a w wywoływanej funkcji, a następnie przekazujemy również wartość a, traktując ją jako argument słowa kluczowego. teraz a mają dwie wartości:
jeden to wartość pozycyjna: a = 1
druga to wartość ze słowem kluczowym a = 12
Rozwiązanie
Musimy zmienić hello(1, 2, 3, 4,a=12)
na, hello(1, 2, 3, 4,12)
więc teraz a otrzyma tylko jedną wartość pozycyjną, która wynosi 1, a b otrzyma wartość 2, a reszta wartości otrzyma * args (parametr o zmiennej długości)
Dodatkowe informacje
jeśli chcemy, aby * argumenty otrzymały 2,3,4, a a powinno otrzymać 1, a b powinno otrzymać 12
wtedy możemy to zrobić
def hello(a,*args,b=1):
pass
hello(1, 2, 3, 4,b=12)
Coś więcej :
def hello(a,*c,b=1,**kwargs):
print(b)
print(c)
print(a)
print(kwargs)
hello(1,2,1,2,8,9,c=12)
wynik :
1
(2, 1, 2, 8, 9)
1
{'c': 12}
self
jest lepsze niż niejawnethis
.