Debe utilizar mundial para acceso LOCAL variable (ni idea de por qué) de python;Kivy
Pregunta
Recientemente he descargado Kivy como se me ha dado la más comprensible la documentación y los tutoriales, etc.He tratado de pygame y de cocos, pero nunca podría conseguir una fundación, y con Kivy ha sido fácil.
Así que aquí está mi problema, he hecho un juego de pong, y estoy tratando de hacer el juego en pausa por detener el pong, y luego comenzar de nuevo cuando es unpaused (cambiando su velocidad).
Aquí está mi código:
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
Como se puede ver en los comentarios, Si yo no uso global, I se hace referencia a antes de la asignación de error.Pero es una variable local, no entiendo por qué esto está ocurriendo.
Alguien tiene alguna idea?gracias?
Editar:Sólo para asegurarse de que todo el mundo tiene claro en mis intenciones, yo NO quiero usar un mundial, pero es la única manera de que funcione.Yo preferiría no usar variables globales.
Solución
Si fijas la sangría de error de nuevo verás que:
Se puede ver que:
el escape
escape
debería funcionar sin el mundial, sin embargotempBallVelocity
será considerado como una variable local.Si desea modificar una variable global que necesita para agregar la declaración global de decirle a python quetempBallVelocity
no es local, sino global.En el segundo caso,
tempBallVelocity
no es localmente inicializado si no se introduce el escape del bloque y por lo tanto no puede ser utilizado como un local R-value.En este caso python debe buscar la variable fuera de la clase.EstempBallVelocity
realmente una variable global ?
comentario:si los casos son exclusivos debe utilizar elif
en lugar de if
para el segundo caso.
Otros consejos
El código dentro de la función no es sangría, es que sólo un error de copia?Si no me pregunto por qué usted no recibe un mensaje de error.
Editar:Ok, es fácil establecer la variable tempBallVelocity
al llamar a la función con 'escape'
pero, a continuación, sale de la función y se pierde la variable.Si a continuación, llamar con el "acento grave' no ha configurado la variable tempBallVelocity
sin embargo, la mejor solución sería que:self.tempBallVelocity = self.ball.velocity
.
Cada vez que se establece una variable dentro de un identated bloque de código, la variable se destruye una vez que usted sale de ese bloque, de nuevo en la anterior identation;
Si usted escribe
if True:
foo = 'foo value, which is a string (?)'
print foo
dentro de un gran script, python se encarga únicamente de la variable foo mientras se está "dentro" de la instrucción if, y una vez que se termina y sale, foo se olvida completamente, con el fin de hacer más rápido las cosas, se entiende que si se establece la variable dentro de una instrucción, se va a utilizar sólo dentro de esa declaración.
Si quería hacer algo como esto
if True:
foo = 'foo value'
# Right now foo has been trashed
if True:
print foo
# Raises an error
Usted tendría que establecer la variable foo fuera el 'si' declaraciones
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 también se puede hacer mediante el establecimiento de foo como variable global, por lo que no es destruida una vez que reciba fuera de la 'if'
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
Pero que puede ser innecesario y confuso en la mayoría de circunstancias, o incluso problemático si usted comienza a hacer todo lo global, por lo que las variables que sólo vas a usar una vez que se acumulan inútilmente en la memoria del dispositivo durante el programa.
Ahora, estás escribiendo una clase, por lo que la manera correcta de hacer lo que está haciendo sería (desde mi punto de vista) para el almacenamiento de la 'tempBallVelocity' variable en la clase como esta
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
Parece que no respeta la regla que acabo de decir, pero la cosa es que cuando se escribe 'auto.tempBallVelocity = ...' se storaging la info en el auto, que es el acceso directo a la PongGame objeto que vamos a crear una instancia en orden a ejecutar el juego, en el que se ejecutará el método, por lo que la variable significa el stock que hay cuando salga el método.
Espero que esta respuesta es útil para usted, usted debe conseguir una más sólida de conocimientos sobre python, Aprender Python De La Manera Difícil es un sitio de un libro con una libre versión de html que me fue útil.
Vea usted!:D