必须使用全局来访问 LOCAL 变量(不知道为什么)python;基维
题
我最近下载了 Kivy,因为它为我提供了最易于理解的教程和文档等。我尝试过 pygame 和 cocos,但始终无法获得基础,而使用 Kivy 就很容易了。
所以这是我的问题,我做了一个乒乓球游戏,我试图通过停止乒乓球来暂停游戏,然后在它未暂停时再次启动它(通过改变其速度)。
这是我的代码:
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
正如您在评论中看到的,如果我不使用全局,我会在分配错误之前被引用。但这是一个局部变量,我不明白为什么会发生这种情况。
有人有主意吗?谢谢?
编辑:只是为了确保每个人都清楚我的意图,我不想使用全局,但这是唯一可行的方法。我不想使用全局变量。
解决方案
如果您再次修复缩进错误,您将看到:你可以看到:
逃亡
escape
但是应该在没有全局的情况下工作tempBallVelocity
将被视为局部变量。如果你想修改一个全局变量,你需要添加全局声明来告诉Python:tempBallVelocity
不是本地的而是全球的。在第二种情况下,
tempBallVelocity
如果不输入转义块,则不会在本地初始化,因此不能用作本地 R值. 。在这种情况下,python 应该在类之外查找变量。是tempBallVelocity
真的是全局变量吗?
评论:如果情况是排他性的,您应该使用 elif
代替 if
对于第二种情况。
其他提示
您的函数内的代码没有缩进,这只是一个复制错误吗?如果没有,我想知道为什么你没有收到错误。
编辑:好的,设置变量很容易 tempBallVelocity
当你调用该函数时 'escape'
但随后函数退出并且您丢失了变量。如果您随后用“反引号”调用它,则您还没有设置变量 tempBallVelocity
然而,最好的解决方案可能是:self.tempBallVelocity = self.ball.velocity
.
每次设置在标识的代码块内的变量时,一旦离开该块,变量就会被销毁,然后返回到以前的标识;
如果您写入
if True:
foo = 'foo value, which is a string (?)'
print foo
.
在一个巨大的脚本里,python只处理foo变量,而它是'内部'的if'语句,一旦结束它并熄灭,Foo被完全忘记,以便更快地制作东西,它可以理解,如果你设置了在语句中的变量,您只能在该语句中使用它。
如果你想做这样的事情
if True:
foo = 'foo value'
# Right now foo has been trashed
if True:
print foo
# Raises an error
.
您必须在“if”语句之外设置foo变量
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'
.
或者您也可以通过将foo设置为全局变量来完成它,因此在“如果'语句之外不会被销毁,因此在'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
.
但在大多数循环中可能是不必要的,令人困惑的是,如果你开始制作一切全球化的变量,你只能在程序期间只使用一次accrue,你只能在你的设备的内存上使用。
现在你正在写一堂课,所以正确的方法要做你正在做的事情会是(从我的角度来看)将“TempballVelocity”变量存储在课程中,如此
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
.
它看起来它不尊重我刚刚告诉过你的规则,但这就是当你写'self.tempballvelocity= ...'你正在存储自己的信息,这是快捷方式Ponggame对象您将实例化以运行游戏,这将运行该方法,因此在获取方法时,变量将在那里存储。
我希望这个答案对你有所帮助,你应该得到一个更坚实的关于python的知识,学习python很难的方式是一本书的网站,具有免费的HTML版本,对我很有用。