Was ist pass-by-assignment?

1 Antwort

Mit pass-by-assignment wird die Art und Weise, wie Werte übergeben werden, beschrieben.

Wenn du in Python ein Argument an eine Funktion übergibst, referenziert der zugehörige Parameter auf das übergebene Argument. Es verhält sich somit genauso wie bei einer normalen Zuweisung (eine Variable zeigt auf das, worauf der rechtsseitige Wert verweist).

Beispiel:

def some_function(parameter):
  print(parameter)

argument = 123
some_function(argument)

Innerhalb der Funktion zeigt parameter nun auf das Objekt mit dem Wert 123 (Beachte: Alles in Python ist ein Objekt).

Nun muss noch beachtet werden, dass es veränderliche und unveränderliche Objekte gibt. Veränderlich bedeutet hierbei, dass du den Objektzustand ändern kannst. Zahlen, boolsche Werte, Strings oder Tuples sind beispielsweise unveränderlich.

Ein plumper Versuch könnte natürlich folgendermaßen aussehen:

def some_function(parameter):
  parameter = 456

argument = 123
print(argument) # 123
some_function(argument)
print(argument) # 123

Doch nach der Zuweisung in der Funktion referenziert die Variable parameter lediglich auf ein neues Objekt (456).

Wenn die Zuweisung bewirken würde, dass auch die Variable argument ihren Wert ändert, spräche man von einem call-by-reference-Verhalten.

Ein Beispiel für ein veränderliches Objekt wäre eine Liste oder ein von dir erstellter komplexer Typ.

Beispiel 1:

def modify_list(numbers):
  numbers[0] = 7

some_numbers = [ 1, 2, 3 ]
modify_list(some_numbers)
print(some_numbers) # [ 7, 2, 3 ]

Der Wert eines Elements in der Liste wird verändert.

Angenommen, die Liste außerhalb der Funktion würde sich nach dem Funktionsaufruf nicht ändern, würde man von einem pass-by-value-Verhalten sprechen. Die Funktion würde eine Kopie der Liste erhalten.

Beispiel 2:

class Person:
  def __init__(self, name):
    self.name = name

def rename(person):
  person.name = "Tim"

tom = Person("Tom")
print(tom.name) # Tom
rename(tom)
print(tom.name) # Tim

Der Wert eines Objektattributs wird geändert.


Ali36116 
Beitragsersteller
 14.03.2023, 08:23

Vielen Dank.

0