2017-10-09 1 views
0

Pourquoi la matrice est-elle remplie de noms comme celui-ci?Remplissage de la matrice avec namedtuples

index insérés de manière incorrecte

Et comment y remédier?

from collections import namedtuple 

Point = namedtuple('Point', ['x', 'y']) 
m, n = 3, 3 
matrix = [[None] * n] * m 
for i in range(m): 
    for j in range(n): 
     matrix[i][j] = Point(i, j) 
for row in matrix: 
    print(row) 

#>>Output 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 

Le résultat devrait être

#>>Output 
#[Point(x=0, y=0), Point(x=0, y=1), Point(x=0, y=2)] 
#[Point(x=1, y=0), Point(x=1, y=1), Point(x=1, y=2)] 
#[Point(x=2, y=0), Point(x=2, y=1), Point(x=2, y=2)] 

Répondre

2

Parce que [] * m fait m copies de la même liste (ils référencent la même liste). Donc quand vous changez l'un d'entre eux, ça change tout. Par conséquent, à la toute fin, la dernière ligne écrase toutes les valeurs que vous avez remplies dans les précédentes.

Modifiez votre initialisation à matrix = [[[None] for i in range(n)] for j in range(m)] et cela fonctionnera très bien.

Voici another StackOverflow answer démontrant les effets secondaires de l'initialisation d'un tableau 2D de cette façon.

0

Je ne sais pas pourquoi, mais le code ci-dessous et ci-dessus ne fonctionne

for k in range(m): 
    matrix[k] = [Point(k, i) for i in range(n)] 
+0

Si vous avez m, n = 4, 3 il y aura une erreur – Vartan

+0

Non. Je ne suis jamais triste de quitter la matrice init. matrice matrice toujours = [[Aucun] * n] * m –

+0

Désolé, vous avez raison – Vartan

0

Si vous imprimez x et y avec fonction d'identification, vous verrez que les références dans la même

from collections import namedtuple 

Point = namedtuple('Point', ['x', 'y']) 
m, n = 3, 3 
matrix = [[None] * n] * m 

for i in range(m): 
    for j in range(n): 
     p = Point(x=i, y=j) 
     matrix[i][j] = p 

     print(id(p.x)) 
     print(id(p.y)) 

Essayez en utilisant comperhensions.

for i in range(m): 
    matrix[i] = [Point(i, j) for j in range(n)] 

for row in matrix: 
    print(row)`