Argumenty są w pythonie przekazywane przez referencje, która troche przypomina wskaźniki jeśli kiedyś się z nimi zetknąłeś.
Generalnie chodzi o to, że taki kod:
x = 5
def zmien(arg):
arg = 10
zmien(x) # x to dalej 5
Jest rownowazny z:
x = 5
arg = x
arg = 10
# i tutaj dziwisz sie ze x jest dalej rowne 5
Wynika to z faktu, że w pythonie wszystko jest obiektem. Liczba 5 to obiekt typu int, ktory lezy gdzies w pamieci, a x to tylko referencja ktora pokazuje gdzie ten obiekt lezy. Jesli stworzysz druga zmienna arg, która tez bedzie "pokazywac" tam gdzie x, a potem każesz zmiennej arg pokazywac gdzie indziej (przypisujesz cos do niej) to nie powinienes sie dziwic ze x dalej pokazuje tam gdzie pokazywał.
Dla samego efektu zmiany wartosci inta w funkcji możesz po prostu zwrocic tą wartość lub przekazać ją opakowaną jakimś typem mutowalnym np tablicą, ale skrajnie nie poleca, bo jest to bardzo na siłe:
def zmien(arg)
arg[0] = 453
x = [5]
zmien(arg)
Do poczytania: https://medium.com/@tyastropheus/tricky-python-i-memory-management-for-mutable-immutable-objects-21507d1e5b95