Frage zu "List within lists"...

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
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Hallo zusammen...

Nach fast 2 Jahren will ich hier auch mal wieder posten... nach diversen Abstechern in anderen Programmiersprachen bin ich wieder zu Python zurückgekehrt.. es gefällt mir doch noch immer am besten.

Wo ich gerade dabei bin, das Wissen wieder aufzufrischen, bin ich über folgendes gefallen.

angenommen

Code: Alles auswählen

list1 = [3,4,6]
list2 = [7,6,2]

gesamtliste = [list1, list2]
Wenn ich jetzt..

>> list1=[5,5,5]

... setze, so ist gesamtliste immer noch auf

>> [[3,4,6],[7,6,2]]

..sehe ich das richtig, das in dem Fall nur Kopien angelegt
werden, aber keine Referenzen? Das gleiche scheint auch für
geschachtelte Dictionaries usw. zu gelten.. Geht das auch mit Referenzen?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Nein, das siehst du falsch. Mit
>> list1=[5,5,5]
bindest du einzig und allein den Namen list1 an [5,5,5] und veränderst nicht die ursprüngliche Liste.

Listen ändert man z.B. über slices:
>> list1[::] = [5,5,5]
Das hätte den erwünschten Effekt. Das bedeutet nämlich: Die Listenmitglieder 0-Ende werden auf [5,5,5] gesetzt, der Name wird aber nicht neu gebunden.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

..aahhh ja. Vielen Dank!

Könnte in so manchen Python-Tutorial und Buch was ich hier habe noch audsdrücklicher betont werden... ist ja schließlich schnell gemacht der Denkfehler!

EDIT: ... dabei habe ich noch ein kleines Problem... das mit der Liste in der Liste war eigentlich nur ein Beispiel, das konkrete "Problem" was ich habe ist eigentlich "Connections aus pyodbc in einer Liste"... Nur dachte ich, dass das mit der obigen Listengeschichte leichter darstellbar wäre.. ist aber wohl nicht soo feinfach übertragbar..

Ich brachme mehrere Connection Objekte (aus pyodbc).

Z.B.

dbconn1
dbconn2

usw.

Diese sind im globalen Namensraum.. damit ich das auch
schön sehe, lege ich mir diese schon ziemlich weit oben im Programm an...

Problem: Das connecten zur DB geschieht erst später, in einer Funktion.

Also haben die dbconnX Variablen da "oben" noch keinen Typ.. Deklarieren geht ja in Python nicht, also lege ich diese
Dinger mit

Code: Alles auswählen

dbconn1 = None
dbconn2 = None
an, nur, damit ich schon "oben" weiß "Aha, ich habe da 2 Connection
Objekte im Einsatz."

Gut. Diese packe ich jetzt in eine Liste weil ich später da mal darüber iterieren will. Z.B. so.

Code: Alles auswählen

dbconnlist = [dbconn1, dbconn2]
später werden dann die dbconnX Variablen erst wirklich
zu Connection Objekten, wenn die entsprechende Funktion
aufgerufen wird.. (mittels id(dbconn1) kann ich auch sehen,
dass sich die ID auch ändert..

Nur in der Liste dbconnlist ändern sich die dortigen Einträge
nicht.

Ich nehme mal an, das liegt in dem Falle daran, dass mit der
"Neuzuweisung" von dbconn1 und dbconn2 ganz neue
Objekte entsehen, die keinen Bezug mehr zu den Einträgen
in dbconnlist haben?

Die Vorgehensweise ist eh nicht so geschickt.. ich weiß.. mir gehts
jetzt mehr so ums Grundverständnis.


Die packe ich in eine Liste..
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Verstanden hast du es anscheinend immer noch nicht. Variablennamen in Python sind so etwas wie Pointer in C oder die Referenzen in Java.

Code: Alles auswählen

dbconnlist = [dbconn1, dbconn2]
Hiermit erstellst du eine Liste die die beiden Objekte enthält, auf die dbconn1 & 2 zeigen. Die liste enthält aber keine C++-Referenzen.

Mit

Code: Alles auswählen

dbconn1 = anderesObjekt
lässt du die Variable (/den Namen) dbconn1 auf das andere Objekt (nicht aber auf die Variable anderesObjekt selbst) zeigen. Das ändert aber natürlich nichts an der Liste. Möchtest das ändern musst du die Liste selbst verändern:

Code: Alles auswählen

dbconnlist[0] = andersObjekt # 0, da dbconn1 ja bei der Listenerstellung als 1. genannt wurde
Was du in Python bei einer Variablenzuweisung machst entspricht in C ungefähr:

Code: Alles auswählen

string * string1; 
string1 = &string2;
Bei der Liste sieht das dann also so aus:

Code: Alles auswählen

(string *) dbconnlist[] = {&dbconn1, &dbconn2}; // so prinzipiell die genaue Syntax dafür ist mir entfallen
dbconn1 = &andererString; // ändert natürlich nichts an dbconnlist
Für meinen C-Quellcode übernehme ich keine Haftung ;)
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Mal einen ganz anderen Ansatz:

-du schreibst dir eine Klasse für die DB-Verbinungen. Kann man dann auch noch weiter aufbohren, um alles DB-relevante auszulagern.
-in deinem Hauptteil legst du eine leere Liste dc_conn_list an
-bei der Initialisierung einer Klasseninstanz läßt du den Namen der Instanz an die Liste anhängen. Das ganze dann noch in ein try..except eingepackt und du kannst im Proramm auch noch sauber reagieren wenn es mit der Verbindung zu einer DB nicht klappt
Antworten