9 Stimmen

python list comprehension: 2d array erstellen

Mögliches Duplikat:
Python 2D-Liste hat seltsames Verhalten, wenn versucht wird, einen einzelnen Wert zu ändern

Leute,

Ich frage mich, ob die beiden folgenden Aussagen identisch sind?

a = [[0]*3]*3
b = [[0]*3 for i in range(3)]

Die Ergebnisse sehen gleich aus. Aber wäre die eine Methode besser als die andere? Was ist hier der Unterschied?

Herzlichen Dank für Ihre Hilfe.

nos

18voto

Charles Ma Punkte 44109

Sie sind nicht dasselbe

>>> a[1][2] = 5
>>> a
>>> [[0, 0, 5], [0, 0, 5], [0, 0, 5]]

>>> b[1][2] = 5
>>> b
>>> [[0, 0, 0], [0, 0, 5], [0, 0, 0]]

Die erste erstellt ein äußeres Array mit Zeigern auf ein einziges inneres Array, während die zweite tatsächlich 3 separate Arrays erstellt.

7voto

joaquin Punkte 77782

Nein, das sind sie nicht.
Im ersten Fall haben Sie (eine Liste von) 3 identischen Listen mit derselben Referenz, im zweiten Fall haben Sie drei verschiedene Listen

>>> a = [[0]*3]*3
>>> a
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> a[0][0]=1

>>> a
[[1, 0, 0], [1, 0, 0], [1, 0, 0]]

>>> b = [[0]*3 for i in range(3)]
>>> b
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> b[0][0] = 1

>>> b
[[1, 0, 0], [0, 0, 0], [0, 0, 0]]

0voto

Ambidextrous Punkte 796

Es ist ein klassischer Fall von "shallow-copy" gegen "deep copy", wie erklärt aquí in den Python-Dokumenten :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X