2011-10-25 4 views
0
size = input('Kirjainmäärä: ') 
kirjaimet = "0ABCDEFGHIJKLMNOPQRSTUVWXYZ" 

ruudukko = [] 
rivi = ['0']*(size*2-1) 

for i in range(0,size): #produce n rows 
    for y in range(0,i+1): #this row needs i+1 letters 
     for z in range(0+i,size*2-1-i): 
      rivi[z] = kirjaimet[size-i] 
    print rivi, i 
    ruudukko.append(rivi) 
print ruudukko 

Ainsi, le code était censé produire des matrices numériques du formatComportement étrange de l'appendice de python?

input=4 

output= 

DDDDDDD 
DCCCCCD 
DCBBBCD 
DCBABCD 

donc est ici la sortie du code ci-dessus avec entrée = 5 (impression Rivi, i -partie)

['E', 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'] 0 
['E', 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'E'] 1 
['E', 'D', 'C', 'C', 'C', 'C', 'C', 'D', 'E'] 2 
['E', 'D', 'C', 'B', 'B', 'B', 'C', 'D', 'E'] 3 
['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'] 4 

everythings ok jusqu'à présent, mais ..

[['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E'], ['E', 'D', 'C', 'B', 'A', 'B', 'C', 'D', 'E']] 

La liste en annexe ruudukko c sort tout rempli de l'objet ajouté en dernier!

Qu'est-ce qui se passe?

+0

rivi pointe actuellement vers un tableau et l'ajout d'un tableau implique donc de placer l'objet tableau dans la dernière position. Si vous voulez aplatir en une seule liste, utilisez la méthode extend(). – dhable

Répondre

2

Vous ne joignez pas cinq listes différentes à votre résultat. Vous ajoutez la même liste cinq fois.

Vous pouvez y remédier en ajoutant un copie de votre liste au résultat:

ruudukko.append(rivi[:]) 

voir travailler en ligne: ideone

+1

Notez que, à cause de ce genre de bug, il est inhabituel en Python de créer une liste complète peuplée de zéros, puis de la faire muter. Plus habituel serait de dire 'rivi = []' au début de chaque ligne et 'rivi.append (kirjaimet [taille-i])' dans la boucle z, comme OP l'a fait avec la liste 'ruudukko'. –

0

Vous mettez le même objet dans la liste ruudukko cinq fois . Donc chacun des 5 items de ruudukko sont en fait liés au même objet.

Parce que list est un type mutable, vous pouvez le modifier et toutes les autres références à ce même objet semblent également être modifiées. Bien sûr, seul un objet est en cours de modification, il vous semble que chaque élément de ruudukko a été modifié. Ce n'est pas le cas, le même objet y apparaît cinq fois.

Pour résoudre ce problème, vous devez créer un nouvel objet de liste chaque fois que vous ajoutez à ruudukko. Il y a beaucoup de façons de le faire, par exemple, vous pouvez le faire comme ceci:

ruudukko.append(list(rivi)) 

L'exemple le plus simple que je peux penser à qui illustre le comportement des objets mutables est le suivant:

>>> a = [0] 
>>> b = a 
>>> b[0] = 1 
>>> a 
[1] 
2

list.append() stocke une référence à l'objet ajouté. Vous avez donc enregistré plusieurs références à votre liste rivi dans votre liste ruudukko. Naturellement, puisqu'ils sont tous en fait le même objet, quand vous en changez un, il change partout où il est référencé. Faites une nouvelle liste rivi chaque fois par le biais de votre boucle.

Ce comportement n'est pas étrange; C'est normal et attendu et devrait être couvert dans tout tutoriel Python décent.

0

Vous avez déclaré rivi une seule fois, puis réaffecté plusieurs fois sa valeur. Vous avez cet objet unique, qui est mutable, ajouté à plusieurs reprises dans votre liste externe ruudukko. Comme l'objet est modifiable et que vous ne le copiez pas, vous obtenez la valeur finale dans toutes les positions de ruudukko.