[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