[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