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]