Giorno a tutti.
Ebbene no, non si tratta di un messaggio spirituale / trascendentale, piuttosto dello strano caso di questa lista annnidata che non vuole morire.

Allora, ho questo script... Non è importante cosa faccia e perchè, vi indico quanto dovrebbe servire a comprendere il problema.

Ho questa funzione che inizializza una matrice bidimensionale: una lista che ne contiene altre 2 formando una griglia 8x8. La funzione restituisce la matrice che poi viene usata in altre parti dello script.

Ecco la funzione:
***
def InizializzaSCH():
   '''Restituisce la matrice per la scacchiera'''
   global inizializzata, SCH
   if inizializzata:
       del col1, col2, SCH
       inizializzata = True
   SCACCHIERA=[]; col1=[]; col2=[]
   for j in range(4):
       col1.append(CASANERA); col1 = col1 [:]
       col1.append(CASABIANCA); col1 = col1 [:]
   for j in range(4):
       col2.append(CASABIANCA); col2 = col2 [:]
       col2.append(CASANERA); col2 = col2 [:]
   for y in range(4):
       SCACCHIERA.append(col1); col1 = col1 [:]
       SCACCHIERA.append(col2); col2 = col2 [:]
   return SCACCHIERA
***

Spero che l'indentazione rimanga nella mail, ci ho messi gli spazi e dovrebbe restare formattata.

Ora, più avanti nello script, io assegno dei valori alle celle della griglia, facendo tipo: SCH[x][y] = dato

Fatte le operazioni che il programma si propone, ad un certo punto prevedo di ripulire la griglia e di ottenerne una copia inizializzata, cioè come l'avevo, subito dopo aver lanciato lo script.

Allora chiamo la mia funzione:

SCH = InizializzaSCH()

Ma, sorpresa delle sorprese, mi ritrovo la matrice che contiene ancora i dati che vi avevo inseriti nelle precedenti elaborazioni.

Ho tentato tutto ciò che so, che non è molto in effetti, per riportare questa matrice all'inizio ma non ci riesco: le ipotesi sono che io stia lavorando su una variabile che appartiene ad un diverso spacename e che non è quella che viene inizializzata, oppure ne è una copia. Oppure l'inizializzazione passa dei riferimenti a variabili (liste col1 e col2) che non si sono cancellate dalla memoria e che quindi contengono ancora i loro dati. Eppure ad inizio funzione io chiamo col1 = [] e col2 = [] Questo, credo, dovrebbe svuotarle.


Grazie per eventuali suggerimenti.

Gabry.

PS: avevo provato anche copy.deepcopy(var) per mantenere la matrice inizializzata intatta e lavorare su delle copie da distruggere alla fine del loro utilizzo e poi ricopiare dalla matrice quando ne fossero servite di nuove, ma nemmeno così funzionava.
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a