Necessario utilizzare globale per l'accesso variabile LOCALE (non so perché) python;Kivy

StackOverflow https://stackoverflow.com//questions/11700648

  •  13-12-2019
  •  | 
  •  

Domanda

Di recente ho scaricato Kivy come me è più comprensibile tutorial e documentazione, etc.Ho provato pygame e cocos ma non avrebbe mai potuto avere un fondamento, e con Kivy è stato facile.

Così heres il mio problema, ho fatto un gioco pong, e sto cercando di rendere il gioco in pausa, fermare la palla pong, e poi iniziare di nuovo quando è unpaused (cambiando la sua velocità).

Ecco il mio codice:

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
        #Why doesnt it work without global?
        #If I don't use a global i get "tempBallVelocity referenced before assignment
            global tempBallVelocity
            tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            #Make the ball go again, thus exiting pause
            #This is where the error occurs if I don't use global
            self.ball.velocity = tempBallVelocity   

Come si può vedere nei commenti, Se io non uso globale, ho fatto riferimento prima assegnazione di errore.Ma è una variabile locale, non riesco a capire perché questo sta accadendo.

Qualcuno ha qualche idea?grazie?

Edit:Solo per assicurarsi che tutti è chiaro nelle mie intenzioni, NON voglio usare un mondiale, ma è l'unico modo che funziona.Preferirei non usare variabili globali.

È stato utile?

Soluzione

Se si rivolge nuovamente l'errore di indentazione, vedrai che: Puoi vedere che:

    .
  1. La fuga generacodictagcode dovrebbe funzionare senza il globale, tuttavia escape sarà considerato come una variabile locale.Se si desidera modificare una variabile globale è necessario aggiungere la dichiarazione globale per dire a Python che tempBallVelocity non è locale ma globale.

  2. Nel secondo caso, tempBallVelocity non è inizializzato localmente se non si immette il blocco di fuga e quindi non può essere utilizzato come locale rvalue .In questo caso Python dovrebbe cercare la variabile al di fuori della classe.tempBallVelocity è davvero una variabile globale?

  3. Nota: se i casi sono esclusivi, è necessario utilizzare tempBallVelocity anziché elif per il secondo caso.

Altri suggerimenti

Il tuo codice all'interno della funzione non è rientrato, è solo un errore di copia?Se non mi chiedo perché non hai un errore.

Modifica: OK, è facile impostare la variabile tempBallVelocity quando si chiama la funzione con 'escape' ma la funzione uscita e si perdono la variabile.Se lo chiami con "Backtick" non hai ancora impostato la variabile tempBallVelocity, la soluzione migliore sarebbe probabilmente: self.tempBallVelocity = self.ball.velocity.

Ogni volta che si imposta una variabile all'interno di un identated blocco di codice, la variabile viene distrutta una volta che si ottiene fuori del blocco, nel precedente concavità;

Se si scrive

if True:
    foo = 'foo value, which is a string (?)'
    print foo

all'interno di un enorme script python gestisce solo la variabile pippo mentre è 'dentro' l'istruzione if, e una volta che finisce ed esce, pippo è completamente dimenticato, per rendere le cose più velocemente, ha capito che se si imposta la variabile all'interno di una dichiarazione, sarà utilizzato solo all'interno di tale dichiarazione.

Se si voleva fare qualcosa di simile a questo

if True:
    foo = 'foo value'

# Right now foo has been trashed

if True:
    print foo
    # Raises an error

È necessario impostare la variabile pippo al di fuori dei 'se' dichiarazioni

foo = ''

if True:
    foo = 'foo value'

# Right now foo still exists and keeps it's recently changed value

if True:
    print foo
    # prints 'foo value'

O si può fare anche attraverso la creazione di pippo come variabile globale, quindi non è distrutta una volta fuori il 'se' istruzione

if True:
    global foo
    foo = 'foo value'

# foo still exists as it's a global variable

if True:
    print foo
    # There's no reason so it wouldn't work

Ma che può essere inutile e confusa nella maggior parte circunstances, o anche problematico se si inizia a fare tutto quello globale, quindi le variabili che si usa solo una volta accumulare inutilmente nella memoria del dispositivo durante il programma.

Adesso si sta scrivendo una classe, in modo che il modo giusto di fare quello che stai facendo sarebbe (dal mio punto di vista) di archiviazione di la 'tempBallVelocity' variabile in classe

class PongGame(Widget):
   ...

    def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
        if keycode[1] == 'escape':
            self.tempBallVelocity = self.ball.velocity
            self.ball.velocity = 0,0


        if keycode[1] == '`':
            self.ball.velocity = self.tempBallVelocity   

Sembra che non rispetta la regola che vi ho appena detto, ma la cosa qui è che quando si scrive 'auto.tempBallVelocity = ... " tu sei l'immagazzinamento le informazioni contenute in sé, che è la scorciatoia per il PongGame oggetto potrete creare un'istanza al fine di eseguire il gioco, che eseguirà il metodo, in modo che la variabile sta memorizzato lì quando si ottiene il metodo.

Spero che questa risposta è utile per voi, si dovrebbe ottenere una più solida conoscenza di python, Imparare Python Il Senso Duro è un sito di un libro con una libera versione html che è stato utile per me.

Vedi tu!!:D

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top