argomenti di funzioni e variabili locali

m
massimocoppola (950 points)
1 15 20
asked Nov 22, 2020 in Programmare in Python by massimocoppola (950 points)
edited Nov 22, 2020 by massimocoppola
stranamente questa cosa (che serve a capovolgere un lista di liste) funziona

def flip_v(img):
    new_new_img = [ ]
    for i in reversed(new_img):
        new_new_img.append(i)
    return new_new_img

img : parametro

new_img : variabile a cui python  passa il parametro
non mi dovrebbe dire che new_img non è definito?
se al posto di new_img metto bug non funziona più.
153 views

1 Answer

Francesco.Danese (2130 points)
0 1 9
answered Nov 22, 2020 by Francesco.Danese (2,130 points)

A me sembrava strano che python riuscisse a passare alla variable new_img il parametro img. Credevo che per passare il contenuto di un parametro dentro una variabile questi dovessero avere lo stesso nome.

Allora, python NON sta passando alcun parametro alla variabile new_img ma sta utilizzando la variabile globale  new_img (esterna a ogni funzione e disponibile a tutte). Attento che è vietato usare variabili globali. Oppure la tua funzione flip_v è definita dentro un altra funzione (ex1 probabilmente) e quindi ogni variabile in ex1 è automaticamente accessibile da flip_v.

Sinceramente non so se l'uso di funzioni "annidate" è concesso ma credo di si, anche se sarebbe un po simile ad usare variabili globali...poi bo dipende da cosa dice il prof.

Altra cosa:

Creo una nuova immagine perché sterbini così fa nella lezione 11. E nell'economia generale di quello che volevo fare non mi sembrava una cattiva idea non modificare l'immagine orginale.

Se scrivi new_imm = list(reverse(imm))

Non stai modificando la vecchia immagine (imm). Stai creando un altra lista che è il reverse di imm, ma imm rimane la stessa

ESEMPIO:  a = [1,2,3,4,5]

                    b = list(reversed(a))

Se poi le printi entrambi vedrai che b sarà [5,4,3,2,1]  ed a sarà ancora [1,2,3,4,5]

Stessa cosa se usi lo slice:

                                          c = a[ : : -1]

a sarà sempre [1,2,3,4,5] mentre c sarà [5,4,3,2,1]

m
massimocoppola (950 points)
1 15 20
commented Nov 22, 2020 by massimocoppola (950 points)
Hai ragione, ha preso i valori da dentro una variabile globale new_img che avevo definito prima. Non credevo potesse succedere.

import images

new_img = images.load("lezione11_3immagine.png") # da qui

images.Image(new_img)

def flip_v_itera_bug(img):
    new_new_img = []
    for i in reversed(new_img): #a qui
        new_new_img.append(i)
    return new_new_img

 new_img2 = flip_v_itera_bug(new_img)
 
Grazie mille