W Pythonie nie działa to w ten sposób. Python przekazuje odniesienia do obiektów. Wewnątrz swojej funkcji masz obiekt - możesz dowolnie modyfikować ten obiekt (jeśli to możliwe). Jednak liczby całkowite są niezmienne . Jedynym sposobem obejścia tego problemu jest przekazanie liczby całkowitej w kontenerze, który można zmodyfikować:
def change(x):
x[0] = 3
x = [1]
change(x)
print x
W najlepszym razie jest to brzydkie / niezdarne, ale w Pythonie nic nie da się osiągnąć. Powodem jest to, że w Pythonie przypisanie ( =
) pobiera dowolny obiekt będący wynikiem prawej strony i wiąże go z tym, co znajduje się po lewej stronie * (lub przekazuje go do odpowiedniej funkcji).
Rozumiejąc to, możemy zobaczyć, dlaczego nie ma sposobu, aby zmienić wartość niezmiennego obiektu wewnątrz funkcji - nie możesz zmienić żadnego z jego atrybutów, ponieważ jest niezmienny i nie możesz po prostu przypisać „zmiennej” nowego wartość, ponieważ wtedy faktycznie tworzysz nowy obiekt (który różni się od starego) i nadajesz mu nazwę, jaką stary obiekt miał w lokalnej przestrzeni nazw.
Zazwyczaj sposobem obejścia tego problemu jest po prostu zwrócenie żądanego obiektu:
def multiply_by_2(x):
return 2*x
x = 1
x = multiply_by_2(x)
* W pierwszym przykładzie powyżej, 3
faktycznie zostaje przekazany do x.__setitem__
.