Python使用dict.get递归返回

时间:2016-01-06 20:18:57

标签: python

我正在为岩石剪刀纸游戏编写代码。但是当我运行它时,它会陷入无限循环。

问题发生在以下代码中。为什么这段代码导致任何输入值的无限循环? (我的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 个答案:

答案 0 :(得分: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]