Referenzübergabe

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
NWA
User
Beiträge: 38
Registriert: Mittwoch 3. Februar 2021, 11:40

Hallo, ich möchte eine externe Variable beschreiben. in met1 wird die Referenz übergeben und korrekt beschrieben. In met2 mache ich das gleiche mit einer Variable. Da sehe ich aber das die IDs unterschiedlich sind. Wie kann ich eine Variablen-Referenz übergeben und wieso geht Python mit Übergaben nicht einheitlich um?

Code: Alles auswählen

def met1(liste_int):
    liste_int += [88,99]
    print("Liste ID intern:", id(liste_int))

liste_ext = [1,2,3]
print("Liste ID extern:", id(liste_ext))
print(liste_ext)
met1(liste_ext)
print(liste_ext)

print()

def met2(var_int):
    var_int += 1
    print("Variable ID intern:", id(var_int))

var_ext = 0
print("Variable ID extern:", id(var_ext))
print(var_ext)
met2(var_ext)
print(var_ext)
Liste ID extern: 1606453121544
[1, 2, 3]
Liste ID intern: 1606453121544
[1, 2, 3, 88, 99]

Variable ID extern: 140715405246704
0
Variable ID intern: 140715405246736
0
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Python geht mit allen "Übergaben" einheitlich um, nämlich per Referenz. Es gibt aber einen Unterschied zwischen veränderlichen Objekten, wie Listen, und unveränderlichen Objekten, wie Zahlen.
Um solche und andere Probleme zu vermeiden, sollte man Objekte, die man übergeben bekommt, gar nicht ändern, sondern bei Bedarf neue Objekte erzeugen. Bei Zahlen geht das Automatisch, bei Listen muß man das selbst machen:

Code: Alles auswählen

def eine_funktion(zahlen):
    neue_zahlen = zahlen + [88, 99]
    print("Liste ID intern:", id(zahlen), id(neue_zahlen)
    return neue_zahlen

zahlen = [1,2,3]
print("Liste ID extern:", id(zahlen))
print(zahlen)
neue_zahlen = eine_funktion(zahlen)
print(neue_zahlen)
print()


def andere_funktion(zahl):
    neue_zahl = zahl + 1
    print("Variable ID intern:", id(zahl), id(neue_zahl))
    return neue_zahl

zahl = 0
print("Variable ID extern:", id(zahl))
print(zahl)
neue_zahl = andere_funktion(zahl)
print(neue_zahl)
Und schon sieht Du, dass sich Python immer gleich verhält.
NWA
User
Beiträge: 38
Registriert: Mittwoch 3. Februar 2021, 11:40

Ahh, das ist das mutable- und immutable-Prinzip. Ich habe mir das hier dazu durchgelesen:
https://qastack.com.de/programming/9860 ... -reference

Dort wird dasselbe geschrieben. Es wird ein neues Objekt erstellt usw. Da bin ich aus Java wahrscheinlich zu sehr an die Kapselung gewöhnt (get/set). Ich werde mal das hier durchlesen:
https://www.python-kurs.eu/python3_properties.php

Trotzdem vielen Dank für deinen Hinweis.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Verhalten von Referenzen hat nichts mit get/set zu tun. Der zweite deiner Links ist an sich nicht ganz falsch, nur die Rede von irgendwelchen Privaten Attributen ist quatsch. So etwas gibt es in Python nicht. Deshalb müssen alle Namen mit doppelten Unterstrichen nur einen haben.
Antworten