Seite 1 von 1

[Python] Was ist Referenz, was Kopie?

Verfasst: 14.05.2014, 16:24
von Schrompf
Moin! Ihr seid doch schlau, und ich gerade verwirrt.

Folgendes kleines Programm soll alle Zeilen aus einer Datei auslesen und anhand Kriterien zu Zeilengruppen zusammengefasst speichern. Da wird dann noch mehr draus, aber als Minimalbeispiel reicht es erstmal.

Code: Alles auswählen

datei = open( "da/dort.txt", 'r', encoding='utf-8')

eintraege = []
aktEintrag = []

for aktZeile in datei:
    aktEintrag.append( aktZeile) # hier wird anscheinend nicht das Objekt selbst in die Liste gepackt, sondern eine Kopie

    if aktZeile.startswith( "bla"):
        eintraege.append( aktEintrag) # hier aber wird nur eine Referenz in die Liste gepackt
        aktEintrag.clear() # und dann leert das clear() hier auch den Eintrag in der Liste.
Warum wird da bei append() einmal eine Kopie untergebracht und einmal nur eine Referenz?

Re: [Python] Was ist Referenz, was Kopie?

Verfasst: 14.05.2014, 17:10
von xq
Ich hab zwar noch kein Python programmiert, kann mir aber gut vorstellen, dass aktZeile ein string ist und aktEintrag eine Liste/Array/Objekt/...
Die meisten Scriptsprachen sehen strings als primitive variablen an, welche (nicht wie in C/C++) eine Referenz auf Speicher sind sondern eben nur ein Wert.

Von daher kannst du gar keine Referenzen auf strings anlegen. Wenn du eine Referenz brauchst, nimm doch ein Wrapper-Objekt, welches nur den string als wert beinhaltet.

Re: [Python] Was ist Referenz, was Kopie?

Verfasst: 14.05.2014, 19:45
von CodingCat
Alles Objekte, manche veränderlich (Listen), andere nicht (Strings). Wenn du nach Referenzen fragst, speichert also jede Variable eine Referenz auf ein Objekt, ist aber selbst nicht referenzierbar, d.h. alle Referenzen werden "by-value" übergeben. Letztlich nicht anders als Zeiger in C: Stringvariablen zeigen auf unveränderliche String-Objekte, Listenvariablen auf veränderliche Listenobjekte; Zuweisung und Übergabe analog zu Zeigern: Keine Kopie, nur Änderung des referenzierten Objekts.

Re: [Python] Was ist Referenz, was Kopie?

Verfasst: 15.05.2014, 13:31
von Schrompf
Es ist also quasi alles ne Referenz. Und in dem obigen Code-Beispiel referenziert dann aktZeile[/] jedesmal ne andere Zeile aus der Datei, aber die Zeilen in der Liste sind davon natürlich unberührt. Die Zuweisung "aktzeile = nächste Zeile aus Datei" ist keine Zuweisung im Sinne "Textinhalt", sondern nur ne Umreferenzierung.

Ok, ergibt Sinn. Danke euch!

Re: [Python] Was ist Referenz, was Kopie?

Verfasst: 15.05.2014, 15:35
von Schrompf
OffTopic: Ich wünschte, ich könnte ein if aus List Comprehensions auch bei for benutzen.

Re: [Python] Was ist Referenz, was Kopie?

Verfasst: 18.05.2014, 10:22
von Sternmull
Kannst du ja. Außerdem kann man "with" verwenden um die Datei automatisch schließen zu lassen wenn der with-Block verlassen wird (bisschen wie Destruktoren in C++). So lässt sich das auf einen Zweizeiler reduzieren:

Code: Alles auswählen

with open('foo.txt') as f:
    eintraege = [line for line in f if line.startswith('bla')]
Um die Zeilen anhand komplexerer Regeln heraus zu fischen sind übrigens regular expressions äußerst nützlich.