Visibilità delle risorse

Locale/globale

La risorsa all’interno della funzione appartiene all’ambiente locale, non è visibile all’esterno

def funzione_1(): 
    a=100    
    print(a)       # 100

def funzione_2(): 
    print(a)       # ERRORE

funzione_1()
funzione_2()
print(a)           # ERRORE

La risorsa globale è visibile all’interno della funzione (solo in lettura)

def funzione(): 
    print(a)      # 10 
    print(a+100)  # 110 

a=10 
print(a)          # 10 
funzione()    
print(a)          # 10

La risorsa non è modificabile all’interno della funzione perché è stata utilizzata in lettura (quindi si riferisce a una risorsa globale)

def funzione(): 
    print(a)     # 10 
    a=100        # ERRORE 

a=10 
print(a)         # 10 
funzione()

La risorsa, utilizzata in scrittura, è locale e copre la risorsa globale con lo stesso nome

def funzione(): 
    a=100 
    print(a)     # 100 

a=10 
print(a)         # 10 
funzione() 
print(a)         # 10

La risorsa globale a diventa visibile all’interno della funzione con la dichiarazione global a

def funzione(): 
    global a
    print(a)     # 10 
    a=100
    print(a)     # 100 

a=10 
print(a)         # 10 
funzione()
print(a)         # 100

Osserva

  1. Alla chiamata della funzione il parametro a1 viene passato alla funzione.
  2. La funzione possiede un parametro formale a che riceve il valore del parametro attuale a1 (10)
  3. Il parametro a si comporta come una variabile locale (lettura/scrittura).
  4. Le modifiche al valore di a non influenzano il valore di a1.
def funzione(a): 
    print(a)      # 10 
    a=100 
    print(a)      # 100 

a1=10 
a2=20 
print(a1, a2)     # 10 20
funzione(a1) 
print(a1, a2)     # 10 20

Risorse strutturate

Le risorse globali strutturate sono visibili all’interno delle funzioni, le modifiche sono permanenti

def funzione(): 
    print(x)     # [10, 20] 
    x[1]=1000 
    print(x)     # [10, 1000] 

x=[10, 20] 
print(x)         # [10, 20] 
funzione() 
print(x)         # [10, 1000]

La risorsa locale x copre la visibilità della risorsa globale con lo stesso nome

def funzione(): 
    x=[1,2,3]
    print(x)     # [1,2,3] 

x=[10, 20]
print(x)         # [10, 20] 
funzione() 
print(x)         # [10, 20]

Il parametro formale x della funzione si riferisce alla risorsa strutturata globale x1.
Le modifiche a x (x1) sono permanenti.

def funzione(x): 
    print(x)      # [10, 20] 
    x[1]=1000 
    print(x)      # [10, 1000] 

x1=[10, 20] 
x2=[1, 2, 3] 
print(x1, x2)      # [10, 20] [1, 2, 3] 
funzione(x1)
print(x1, x2)      # [10, 1000] [1, 2, 3]

Parametri misti

I parametri formali della funzione x e a sono di tipo diverso

  • x si riferisce alla risorsa strutturata x1 (le modifiche a x (x1) sono permanenti)
  • a è una risorsa locale che alla chiamata assume il valore del parametro attuale a1 (le modifiche ad a sono locali).
def funzione(x, a): 
    print(x, a)      # [10, 20] 10 
    x[1]=1000 
    a=100
    print(x, a)      # [10, 1000] 100 

a1=10 
a2=15 
x1=[10, 20] 
x2=[1, 2, 3] 
print(x1, a1)        # [10, 20] 10
funzione(x1, a1)
print(x1, a1)        # [10, 1000] 10