[Python] La matrice immortale.

Gabriele Battaglia iz4apu a libero.it
Mar 1 Lug 2014 11:39:11 CEST


Il 30 giugno 2014 10:54, Gabriele Battaglia <iz4apu a libero.it> ha scritto:
> 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
> ***
>

Daniele:
Ci sono delle cose strane nella tua funzione:

GB: ciao Daniele, Non avevo alcun dubbio :)

Tu:
1. "global": quando usi questa istruzione poniti sempre la domanda se
non sia il caso di ripensare la logica del programma.

Io: in realtà non la userei se non fosse che arrivano degli Unbounded local 
Error. Penso di aver compreso il meccanismo della visibilità delle variabili 
ma evidentemente non è così. Tieni comunque conto che qui si tratta di un 
progettino da poco, poche centinaia di righe che sono più un esercizio che un 
vero lavoro. Le variabili globali mi servono ma so che, in cose più complesse 
sarebbe bene non ci fossero affatto.

Tu:
2. " if inizializza: [...] inizializza = True": se inizializza è già
True è inutile assegnargli True.

Io: la prima volta che viene chiamata quella funzione, inizializza è False. 
L'idea era, di usare del sulla matrice della scacchiera, dalla seconda 
chiamata in poi, della funzione, per evitare quel fastidioso problema della 
lista che non si svuotava dei vecchi dati. In realtà, non funzionava come 
soluzione e l'ho rimossa come suggerivi.

Tu:
3. "SCACCHIERA": in Python la convenzione è che il TUTTOMAIUSCOLO
viene usato per le costanti.

Io: Infatti l'idea era quella, una costante costruita con un algoritmo ma poi 
immutabile per il resto del programma, da cui copiare altre griglie da 
utilizzare. Forse ha ragione Gollum, era meglio fare una classe Scacchiera da 
cui poi prendere oggetti vuoti ma ero partito con uno script piccolo e non mi 
sembrava il caso di scomodare le classi.

Tu:
4. ogni volta che aggiungi un elemento ad una colonna poi ricopi la
colonna, mossa assolutamente inutile.

Io: avevo sperimentato un fenomeno strano. Se non copio la colonna: col = col 
[:], poi un elemento di col, si ripete per tutte le 8 colonne della griglia, 
perchè Scacchiera poi conterrebbe 8 riferimenti alla stessa lista col, e 
quindi ripeterebbe le 8 colonne identiche. Se invece copio con [:], si creano 
liste nuove, colonne nuove da aggiungere a SCACCHIERA. Può darsi che stia 
sbagliando ma solo così riesco a farla funzionare.

Tu:
5. I due primi cicli possono essere riuniti in uno unico.

Io: vero, imperizia mia.

Tu:
6. Il terzo ciclo non costruisce una scacchiera con diverse colonne ma
sempre con le stesse due: le ultime create dai cicli precedenti.

Io: questo passaggio non riesco a capirlo.

Grazie per il tuo aiuto ed i suggerimenti.

Gabriele. 



Maggiori informazioni sulla lista Python