Werte in Listen mit indirekter Adressierung ...

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
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

Hallo ersteinmal,

ich bin neu hier und bei Python, habe aber ein Problem bei welchem mir bisher weder die Board-Suche noch die Tante google helfen konnte. Wahrscheinlich liegt das daran das ich die falschen Suchwörter benutze.Wenn dem so ist, dann wäre ich für einen Link dankbar, aber für "direkte" Hilfe natürlich noch dankbarer ;)

Also hier mein Problem:
Vorab:
Ich habe mit folgendem Code ein zweidimensionales Array erzeugt:

Code: Alles auswählen

tbl = []
tb = [0, 0, 0, 0, 0, 0, 0, 0, 0]
for i in range(0, 19):
    tbl.append(tb)
Darin speicher ich 18 x 9 Werte (der "0te" Eintrag wird nicht benötigt). Ich kann die einzelnen Werte nun z.B. mit tbl[1][1] abfragen. Nun habe ich eine Funktion der ich zwei Werte übergebe und die diese Werte benutzt um den entsprechenden Eintrag zu erhöhen, also z.B. so:

Code: Alles auswählen

def testfunc(a, b):
    tbl[a][b] += 1
Unglücklicherweise klappt das nicht so wie ich mir das danke, genauer gesagt werden dann alle Werte in dem Array erhöht.

Wo liegt mein Denkfehler. Schon mal Danke im Vorraus ;)
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

tb enthaelt eine Referenz auf die Liste [0,0,...,0]. Dann erzeugst du tbl und packst da ganz oft die Referenz auf die obige Liste rein. Jeder Eintrag von tbl 'zeigt' dann auf die obige Nuller-liste, welche aber nur ein einziges Mal vorhanden ist!

Aenderst du jetzt einen Eintrag aus tbl, wird die eine Nuller-Liste geaendert. Da alle Eintraege von tbl auf diese Liste zeigen, gibt dir die Ausgabe von tbl, dass sich jeder Eintrag in tbl geandert hat. Klar, sie zeigen ja alle auf die gleiche Liste!

Abhilfe: Echte Kopien der Nuller-liste erzeugen. Z.B. tbl.append(tb[:]). Wenn du nur mit Nullen initialisieren willst, ginge das auch so:

Code: Alles auswählen

>>> a = [[0 for i in range(5)] for i in range(3)]
>>> a
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
Pumeluk2
User
Beiträge: 26
Registriert: Samstag 24. März 2007, 11:24

tb enthaelt eine Referenz auf die Liste [0,0,...,0]. Dann erzeugst du tbl und packst da ganz oft die Referenz auf die obige Liste rein.
Weil ich dies für eine kluge Idee hielt um mein Array zu erzeugen, das ich nur Referenzen und keine Werte darein pack, da wär ich wohl nie drauf gekommen ;)

Herzlichen Dank.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Das koenntest du ja immernoch erreichen, indem du fuer jeden Index in der Liste eine Liste erstellst. Ob das allerdings so sinnig ist... bleibt die naechste Frage ;)
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten