Python Liste der Listen – Zugriff auf einzelne Elemente

Ich versuche, auf ein bestimmtes Element einer Liste von Listen in Python zuzugreifen. Ich bringe ein bisschen C / Java-Gepäck und denke an diese Datenstruktur als 2D-Array. In meinem Kopf sollte die untenstehende Operation das erste Element der ersten Liste nur beeinflussen, loc1[0][0] in Java sprechen. In der Praxis ist das erste Element jeder Unterliste betroffen, dh loc1[0][0] , loc1[1][0] und loc1[2][0] . Irgendeine Idee, warum das ist?

 def move(loc, dir, nrows, ncols): loc1 = [[0.0] * ncols] * nrows for col in range(1): for row in range(1): loc1[row][col] += 100.0 * loc[row][col] return loc1 nrows = 4 ncols = 3 p = [[1.0 / (ncols * nrows)] * ncols] * nrows #uniform prior print p p = move(p, [0, 1], nrows, ncols) print p 

  • BST in Vorbestellung drucken
  • Welche Programmierstruktur für den Clustering-Algorithmus
  • Python bekommen zufällige Taste in einem Wörterbuch in O (1)
  • Circle Queue Python
  • Wie kann man heapq den Haufen eines bestimmten Attributs auswerten?
  • Was wäre ein "gefrorenes Dict"?
  • 2 Solutions collect form web for “Python Liste der Listen – Zugriff auf einzelne Elemente”

    Ich habe das schon mal passiert und es ist frustrierend.

    Dein Problem ist diese Codezeile, was nicht tut was du denkst, es ist:

     loc1 = [[0.0] * ncols] * nrows 

    [0.0] * ncols erstellt eine einzelne Liste, die durch Verweis auf Ihre 2D-Liste übergeben wird.

    Versuche dies:

     loc1 = [[0.0 for y in range(ncols)] for x in range(nrows)] 

    [x]*n erzeugt eine Liste, die das gleiche x Element n mal enthält.

    L = [0.0] * ncols arbeitet, weil 0.0 ein float ist und floats in Python unveränderlich ist also L[0] += 1.1 ändert sich nicht 0.0 aber platziert 1.1 an seinem Platz.

    Listen sind also also L = [[0]*ncol]*nrow wenn du eine beliebige Zeile in L = [[0]*ncol]*nrow du alle, weil es das gleiche Objekt ist.

    Um es zu beheben könnte man:

     L = [[0.0]*ncols for _ in xrange(nrows)] 

    Es erstellt eine neue Liste für jede Zeile, so dass Sie sie unabhängig ändern können.

    Oder:

     from itertools import repeat L = [[0.0]*ncols for _ in repeat(None, nrows)] 

    Was für Sie besser lesbar ist.

    Python ist die beste Programmiersprache der Welt.