2016-01-06 39 views
1

我正在写岩石剪纸游戏的代码。但是当我运行它时,它会陷入无限循环。Python递归返回使用dict.get

问题发生在下面的代码中。为什么这段代码会导致任何输入值的无限循环? (我的Python版本是3.5.0)

class Peoples(object):    
    def recept(self): 
     u = input('choose..r or s or p: ') 
     print('choice: ',{'r':'rock','s':'scissor','p':'p'}.get(u,'{} (wrong input)'.format(u))) 
     return {'s':0,'r':1,'p':2}.get(u,self.recept()) 

P=Peoples() 
P.recept() 

回答

1

由于get的第二个参数被不管是否将最终由get使用执行。你应该把它分解成多行,因此只递归调用必要时:

d = {'s':0,'r':1,'p':2} 
if u in d: 
    return d[u] 
else: 
    return self.recept() 

不过说真的,这将是最好不使用递归的一切,因为你打的最大递归深度并在用户连续选择足够次数的输入后崩溃。

def recept(self): 
    d = {'s':0,'r':1,'p':2} 
    while True: 
     u = input('choose..r or s or p: ') 
     print('choice: ',{'r':'rock','s':'scissor','p':'p'}.get(u,'{} (wrong input)'.format(u))) 
     if u in d: 
      return d[u]