[Python] Was ist Referenz, was Kopie?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Schrompf
Moderator
Beiträge: 4872
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

[Python] Was ist Referenz, was Kopie?

Beitrag 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?
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
xq
Establishment
Beiträge: 1582
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

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

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

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

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

Beitrag 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.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
Benutzeravatar
Schrompf
Moderator
Beiträge: 4872
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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!
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4872
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag von Schrompf »

OffTopic: Ich wünschte, ich könnte ein if aus List Comprehensions auch bei for benutzen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

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

Beitrag 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.
Antworten