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.
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?
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.
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…
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.
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.
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: