Topic: errore in pygame AIUTO PLS  (Letto 379 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
errore in pygame AIUTO PLS
« il: Maggio 25, 2020, 20:18 »
.
« Ultima modifica: Maggio 27, 2020, 13:22 da HGGHGG »

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #1 il: Maggio 27, 2020, 10:45 »
.
« Ultima modifica: Maggio 27, 2020, 22:55 da HGGHGG »

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #2 il: Maggio 27, 2020, 11:00 »
.
« Ultima modifica: Maggio 27, 2020, 22:56 da HGGHGG »

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #3 il: Maggio 27, 2020, 11:09 »
.
« Ultima modifica: Maggio 27, 2020, 22:56 da HGGHGG »

Offline nuzzopippo

  • python neanderthalensis
  • ****
  • Post: 381
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #4 il: Maggio 27, 2020, 11:52 »
Avete capito qual è il problema
Qualcuno legge quello che scrivo

Per leggere si, leggo, come penso anche molti altri, per "capire il problema" è un'altra storia.

Personalmente non ho mai utilizzato la libreria pygame, quindi non avrei di per se molte idee sull'argomento, quando poi si somma che non hai nemmeno compreso il codice nei tags "pythoncode", non l'ho guardato attentamente.

Il messaggio che ricevi è chiaro :
UnboundLocalError: local variable 'basex' referenced before assignment


ad un certo punto hai utilizzato la variabile "basex" senza averla referenziata, il traceback completo avrebbe indicato la linea di codice in cui accade la faccenda, l'utilizzo di "pythoncode" avrebbe potuto permettere di trovare agevolmente il punto in questione, ovviamente "se" il codice fosse completo.

In merito al capire il "perché" avvenga : è certo un errore nell'algoritmo applicato, se poi sia causato da problemi di scope della variabile (visibilità), utilizzo della stessa prima che venga valorizzata o altro ancora è tutto da vedere, bisognerebbe farsi l'analisi del codice completo (ovviamente condito con adeguata conoscenza della libreria) per potersene rendere conto.

allo stato vedo due istruzioni "basex += 20", nella funzione "menu()" e nella funzione "inizializza()" ... saranno la stessa variabile? non saprei dirlo, se definite nell'ambito dei singoli metodi/funzioni no, sarebbe variabili diverse (cerca "visibilità delle variabili" su google) ma com'è nel resto del codice?

... comprendereai, detto quanto su, che è difficile dare una risposta a ciò che non si conosce ed oltre tutto non è chiaro.

[Edit] ... mi è venuto in mente che, magari, Tu possa aver fatto qualcosa del genere :
Python 3.8.0 (default, Oct 28 2019, 16:14:01) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> basex += 20
Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    basex += 20
NameError: name 'basex' is not defined
>>> basex = 0
>>> basex += 20
>>> basex
20
>>>


ossia aver tentato di incrementare basex senza neanche averla definita ... difficile da immaginare, ma sai mai ...
« Ultima modifica: Maggio 27, 2020, 12:24 da nuzzopippo »

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #5 il: Maggio 27, 2020, 13:03 »
.
« Ultima modifica: Maggio 27, 2020, 22:56 da HGGHGG »

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #6 il: Maggio 27, 2020, 13:05 »
.
« Ultima modifica: Maggio 27, 2020, 22:57 da HGGHGG »

Offline HGGHGG

  • python unicellularis
  • *
  • Post: 13
  • Punti reputazione: 0
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #7 il: Maggio 27, 2020, 13:37 »
.
« Ultima modifica: Maggio 27, 2020, 22:57 da HGGHGG »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.154
  • Punti reputazione: 9
    • Mostra profilo
Re:errore in pygame AIUTO PLS
« Risposta #8 il: Maggio 27, 2020, 15:36 »
D'accordo, adesso però sarebbe meglio smetterla, non credi?
pls
pls
PLS smettila.

Per qualche motivo il codice non è più visibile nel messaggio originario, ma non è che ci sia molto da indovinare in un UnboundLocalError. E' un  classico sbaglio dei principianti, tanto che esiste anche una FAQ nella documentazione di Python: https://docs.python.org/3/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

Nunzio, quello che hai fatto vedere è un NameError, non un UnboundLocalError. Sono due cose diverse.
UnboundLocalError è una sotto-classe di NameError, ovvero è un tipo particolare di NameError.
Un NameError è quello che ottieni se cerchi di accedere a un nome non definito nello scope globale.
Un UnboundLocalError è quello che ottieni se cerchi di accedere a un nome non definito nello scope locale.

Quindi, questi sono NameError:

# ESEMPIO 1
a = b +1 # NameError: "b" non esiste

def foo():
    return x +1  # NameError: "x" non esiste

Se definisci una variabile dentro una funzione, il nome è collegato nello scope locale. Quindi questo funziona:

# ESEMPIO 2
def foo():
    x = 0
    return x + 1 # adesso "x" esiste, sia pure nello scope locale

Se cerchi di raggiungere una variabile che non è stata definita nello scope locale MA è definita in quello globale, questo funziona comunque perché l'algoritmo di ricerca dei nomi la trova lo stesso:

# ESEMPIO 3
x = 0
def foo():
    return x + 1 # funziona

Se assegni una variabile locale *con lo stesso* nome di una già assegnata globalmente, sovrascrivi il nome MA SOLO nello scope locale:

# ESEMPIO 4
x = 0
def foo():
    x = 1
    return x
print(foo()) # restituisce "1", ossia lo x locale
print(x) # restituisce "0", ossia lo x globale

Il problema ce l'hai se, oltre ad assegnare, *contemporaneamente* cerchi anche di accedere alla variabile che ancora non esiste.
Per esempio, questo è un NameError:

# ESEMPIO 5
z = z + 1 # NameError (se non avevi già definito "z" prima)

Il NameError è dovuto al fatto che Python guarda la parte sinistra, e dice "ok, adesso devo riservare un nome "z"... e vediamo un po' quale valore gli devo assegnare..." e poi guarda la parte destra. E qui trova un'espressione che comprende "z"... ora quello che vorrebbe fare sarebbe sostituire "z" con il suo valore attuale... peccato che in questo momento "z" non abbia ancora nessun valore assegnato. E quindi, bang!, NameError.

Ma che cosa succede quando fai la stessa identica cosa, ma nello scope locale invece di quello globale?
Indovinato! Invece di un NameError, hai un UnboundLocalError:

# ESEMPIO 6
def foo():
    w = w + 1 # sbam! UnboundLocalError
    return w

Fin qui è facile, a parte il cambio di nome dell'errore. Ma quello che sconcerta il principiante, in genere, è che se fai

# ESEMPIO 7
x = 1
def foo():
    x = x + 1 # sbam!, lo stesso
    return x

hai *lo stesso* un UnboundLocalError, anche se la "x" in realtà sarebbe definita, nello scope globale. Ma il fatto è che quando assegni "x" nello scope locale, la tua "x" locale maschera quella globale... giusto un attimo prima che Python passi alla parte destra dell'assegnamento!... e quindi adesso Python cerca una "x" locale, non la trova, e sbam!
Ovviamente questo è il tipo di problema che si risolve con "global" (anche se è una cattiva pratica, e bisogna sapere che cosa si sta facendo bla bla bla):

# ESEMPIO 8
x = 1
def foo():
    global x
    x = x + 1 # brutto ma funziona
    return x



Ecco fatto. Questo è ciò che c'è da sapere su UnboundLocalError.
Il codice dell'OP rientra nella casistica dell'esempio 6, non è difficile da vedere anche se continua a non formattare il codice nonostante gli sia stato ripetutamente richiesto (magari non abbiamo messo abbastanza PLS PLS PLS PLS). Probabilmente è successo che ha copiato del codice che funzionava in un contesto e in un altro contesto mancano degli assegnamenti precedenti.
Oppure sta cercando di usare Pygame prima di aver capito le basi di Python.

In ogni caso, niente che qualche mese di studio di Python non possa risolvere, pls, pls, PLS.