[Python] La matrice immortale.
Gabriele Battaglia
iz4apu a libero.it
Lun 30 Giu 2014 10:54:45 CEST
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.
Maggiori informazioni sulla lista
Python