Liste, Änderungen werden funktionsübergreifend übernommen

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
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Hallo,
ich habe ein Problem mit der Listenfunktion pop() und demErsetzen von Einträgen.

Ich denke, der Code erklärt mein Problem besser, als ich es beschreiben könnte.

Code: Alles auswählen

def DoSomething(A):
    A[0] = [5, 6]
    B = A.pop()

    return

A = [[1, 2], [3, 4]]
print A
DoSomething(A)
print A
liefert als Ergebnis:

Code: Alles auswählen

[[1, 2], [3, 4]]
[[5, 2]]
Wieso wird A nicht nur in der Funktion verändert bzw. was kann ich tun, damit es nur in der Funktion verändert wird?
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

in Python werden immer Referenzen übergeben und keine Kopien. Wenn du eine Kopie haben willst, kannst du das mit:

Code: Alles auswählen

new_list = old_list[:]
in deiner Funktion machen.

Gruß,
Manuel
Nergal
User
Beiträge: 72
Registriert: Montag 6. Oktober 2008, 14:02

Bei den Standartdatentypen wie String, int, ... ist dies aber scheinbar nicht der Fall.

Wenn ich an Diesen innerhalb von Funktionen Änderungen vornehme, machen sich Diese nicht funktionsübergreifend bemerkbar.

Aber danke für den Tip, hatte es zuerst ohne [:] probiert. Da gab es aber auch wieder Probleme, da es sich scheinbar wieder nur um eine Referenz handelt.
BlackJack

@Nergal: Du kannst an Zeichenketten und Zahlen keine Änderungen vornehmen, die sind unveränderbar. Du kannst höchstens innerhalb einer Funktion an den lokalen Namen neue Objekte binden, das hat natürlich keinen Einfluss auf andere Namen und die Objekte an die sie gebunden sind.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nergal hat geschrieben:Bei den Standartdatentypen wie String, int, ... ist dies aber scheinbar nicht der Fall.
Weil du Strings nicht verändern kannst, daher kommt so ein Problem nicht vor.
Nergal hat geschrieben:Wenn ich an Diesen innerhalb von Funktionen Änderungen vornehme, machen sich Diese nicht funktionsübergreifend bemerkbar.
Letztendlich ist es ganau das was hier diskutiert wurde.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten