Pygame-RuntimeError:调用Python对象时超过最大递归深度
当我尝试运行代码时,我经常会遇到以下错误:Pygame-RuntimeError:调用Python对象时超过最大递归深度,python,pygame,Python,Pygame,当我尝试运行代码时,我经常会遇到以下错误: RuntimeError: maximum recursion depth exceeded while calling a Python object 我很困惑为什么会发生这种情况,我试图使一个图片闪烁,并不断向下移动的屏幕,作为一个对象,玩家必须回避,如果点击被“杀死”(仍然添加碰撞)。当我开始收到错误消息时,会向shell发送以下消息: File "C:\Users\John\Desktop\Michael\V'Room External\GA
RuntimeError: maximum recursion depth exceeded while calling a Python object
我很困惑为什么会发生这种情况,我试图使一个图片闪烁,并不断向下移动的屏幕,作为一个对象,玩家必须回避,如果点击被“杀死”(仍然添加碰撞)。当我开始收到错误消息时,会向shell发送以下消息:
File "C:\Users\John\Desktop\Michael\V'Room External\GAME_MAIN_.py", line 195, in movement
fallingObject()
File "C:\Users\John\Desktop\Michael\V'Room External\GAME_MAIN_.py", line 206, in fallingObject
movement()
File "C:\Users\John\Desktop\Michael\V'Room External\GAME_MAIN_.py", line 160, in movement
print(x)
File "C:\Python34\lib\idlelib\PyShell.py", line 1352, in write
return self.shell.write(s, self.tags)
RuntimeError: maximum recursion depth exceeded while calling a Python object
有关守则如下:
def movement():
crashed = False
while not crashed:
print(x)
...
if x < -10:
x = -10
else:
if x > 490:
x = 490
else:
fallingObject()
def fallingObject():
global w
w = 20
global o_x
o_x = random.randrange(0,width)
objectSpawn = True
while objectSpawn:
movement()
...
def movement():
崩溃=错误
虽然没有崩溃:
打印(x)
...
如果x<-10:
x=-10
其他:
如果x>490:
x=490
其他:
fallingObject()
def fallingObject():
全球w
w=20
全球o_x
o_x=random.randrange(0,宽度)
objectSpawn=True
对象生成时:
运动()
...
问题是,在某些条件下,您的移动()
方法调用fallingObject()
然后调用移动()
,然后调用fallingObject()
然后调用移动()
,然后调用fallingObject()
。。。如果没有最大的递归深度,它们将继续无限地相互调用。Python检测到此模式并关闭您的程序。无限递归总是不好的
如果您查看这些方法的过于简化版本,您可以看到它们相互调用:
def fallingObject():
...
movement()
...
及
由于代码中的条件,这种行为并不总是发生,只有当-10问题是在某些条件下,
movement()
方法调用fallingObject()
然后调用movement()
并调用fallingObject()
,然后调用movement()
然后调用fallingObject()
。。。如果没有最大的递归深度,它们将继续无限地相互调用。Python检测到此模式并关闭您的程序。无限递归总是不好的
如果您查看这些方法的过于简化版本,您可以看到它们相互调用:
def fallingObject():
...
movement()
...
及
由于代码中的条件,只有当-10
坠落对象
和移动
相互调用时,只要对象生成
和未崩溃
均为真
,这种行为才会发生。由于movement
在修改objectSpawn
之前被调用,而crash
仅在用户退出时才被更改,因此他们会互相调用,直到达到递归限制(默认为1000),而我在代码中看不到任何延迟或滴答率,这种情况会很快发生
请注意,这些调用中的每一个都发生在
while
循环中。重新构造代码以使用这些循环运行游戏(您甚至可能不需要两者),而不是像这样进行递归调用。fallingObject
和movement
只要object\u Spawn
和未崩溃
都是True
就互相调用。由于movement
在修改objectSpawn
之前被调用,而crash
仅在用户退出时才被更改,因此他们会互相调用,直到达到递归限制(默认为1000),而我在代码中看不到任何延迟或滴答率,这种情况会很快发生
请注意,这些调用中的每一个都发生在
while
循环中。重新构造代码以使用这些循环运行游戏(您甚至可能不需要两者),而不是像这样进行递归调用。您的移动
函数调用fallingObject
,该函数调用移动
,创建递归循环。Python限制了递归的深度(默认情况下为1000次),因此需要重新组织逻辑以避免递归
顺便说一句,您还应该尽量避免使用可修改的全局变量,因为它们使代码模块化程度降低,这会使调试和扩展程序变得更加困难。但是,如果必须使用它们,则应将global
语句放在每个需要它们的函数的开头。不要将它们分散在功能体中
我还看到
fallingObject
有一个while
循环,该循环始终只运行一次。为什么?您的移动
函数调用fallingObject
,它调用移动
,创建一个递归循环。Python限制了递归的深度(默认情况下为1000次),因此需要重新组织逻辑以避免递归
顺便说一句,您还应该尽量避免使用可修改的全局变量,因为它们使代码模块化程度降低,这会使调试和扩展程序变得更加困难。但是,如果必须使用它们,则应将global
语句放在每个需要它们的函数的开头。不要将它们分散在功能体中
我还看到
fallingObject
有一个while
循环,该循环始终只运行一次。为什么?如何创建最小、完整、可验证的示例:如何创建最小、完整、可验证的示例:
def fallingObject():
...
while objectSpawn:
movement() #<-delete this line
...
objectSpawn = False