[Python] Caccia al bug, UnboundLocalError

Marco Giusti marco.giusti a gmail.com
Lun 15 Apr 2013 18:26:16 CEST


On Mon, Apr 15, 2013 at 05:50:33PM +0200, Adriano Barbieri wrote:
>> Ma di quale linguaggio stai parlando? Non di Python e non di
>> UnboundLocalError.
> 
> Come?
> E' perché ho detto definizione al posto di funzione... e un po' di
> elasticità sù daii :)
> Dopotutto def non è sinonimo di definizione di funzione?
> Scusa ma provvengo ancora dalla programmazione di Amiga con AMOS
> Pro... da molto molto tempo, il Python è pochi mesi che lo mastico e
> mi sono iscritto a questa lista col desiderio di apprendere qualche
> nozione di programmazione in Python, ma fin'oranessuno si è degnato
> a rispondere a un paio di miei quesiti.
> Senza polemizzare, in questa lista mi pare qualcuno abbia una
> esperienza decennale con questo linguaggio, ma forse si sente troppo
> superiore a sto principiante da neanche deniarlo di una risposta.

no, perché quello che hai detto è sbagliato. python è un linguaggio
fortemente e dinamicante tipato. lasciando stare i sofismi, questo vuol
dire che se hai una variabile che è un intero che si chiama `my_i` non
vuol dire che `my_i` è correllata in maniera stretta con variabili di
tipo intero. infatti in python hai oggetti e riferimenti agli oggetti.
`my_i` è un nome del riferimento ma tu puoi fare il binding del nome
`my_i` ad un oggetto di tipo completamente differente. es:

	>>> my_i = 42
	>>> i = my_i
	>>> i is my_i
	True
	>>> my_i = "quarantadue"
	>>> i is my_i
	False
	>>>

alla linea 3 si la seguente situazione:

    nomi    |   oggetti
            |
    my_i -----> 42
            |   ^
    i ----------|
            |

alla linea 5 la situazione cambia:

    nomi    |   oggetti
            |
    my_i -----> 42
            |
    i --------> "quarantadue"
            |

chi ha il libro di martelli questo è ottimamente spiegato.. da qualche
parte, ora non l'ho sotto mano.
 
> UnboudLocalError: Local variable 'x1' referenced before assignment.
> 
> Dalla mia poca esperienza mi dice che è stata usata una variabile
> prima di essere definita e quello che ho suggerito  mi è sembrato
> chiaro e terra terra...

non proprio:

    Python 2.7.3rc2 (default, Apr 22 2012, 22:30:17)
    [GCC 4.6.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'a' is not defined
    >>>

come vedi l'errore è ben differente. Leggi il link che è stato postato
che è molto istruttivo.

ciao
m.


Maggiori informazioni sulla lista Python