Python:获取对象str时的最大递归深度

Python:获取对象str时的最大递归深度,python,recursion,Python,Recursion,我正在制作一个程序来获取数字中的字母数量: def convert(number): lettercount = 0 numstr = str(number) # One's places if len(numstr) is 1: if number == 1 or number == 2 or number == 6: lettercount += 3 elif number == 4 or numb

我正在制作一个程序来获取数字中的字母数量:

def convert(number):
    lettercount = 0

    numstr = str(number)

    # One's places
    if len(numstr) is 1:
        if number == 1 or number == 2 or number == 6:
            lettercount += 3

        elif number == 4 or number == 5 or number == 9:
            lettercount += 4

        else:
            lettercount += 5

    # Ten's places
    elif len(numstr) is 2:
        if number == 10:
            lettercount += 3

        elif number == 11 or number == 12:
            lettercount += 6

        elif number == 15 or number == 16:
            lettercount += 7

        elif number == 13 or number == 14 or number == 19:
            lettercount += 8

        elif number == 17 or number == 18:
            lettercount += 9

        elif number == 20 or number == 30 or number == 40 or\
            number == 80 or number == 90:
            lettercount += 6

        else:
            lettercount += convert(int((numstr)[-1]))
            lettercount += convert(int(round(number, -1)))

    return lettercount

print "88 has %i letters in its name." % convert(88)
print "23 has %i letters in its name." % convert(23)
print "46 has %i letters in its name." % convert(46)
它工作得很好,对88和23返回正确的响应,但对46给出递归深度错误。我很困惑;为什么它只发生在46岁


固定代码:

def convert(number):
    lettercount = 0

    numstr = str(number)

    # One's places
    if len(numstr) == 1:
        if number == 1 or number == 2 or number == 6:
            lettercount += 3

        elif number == 4 or number == 5 or number == 9:
            lettercount += 4

        else:
            lettercount += 5

    # Ten's places
    elif len(numstr) == 2:
        if number == 10:
            lettercount += 3

        elif number == 40 or number == 50:
            lettercount += 5

        elif number == 11 or number == 12 or number == 20 or number == 30 or\
            number == 80 or number == 90:
            lettercount += 6

        elif number == 15 or number == 16:
            lettercount += 7

        elif number == 13 or number == 14 or number == 19:
            lettercount += 8

        elif number == 17 or number == 18:
            lettercount += 9

        else:
            lettercount += convert(int((numstr)[-1]))
            lettercount += convert((int(numstr) // 10) * 10)

    return lettercount

print "88 has %i letters in its name." % convert(88)
print "23 has %i letters in its name." % convert(23)
print "46 has %i letters in its name." % convert(46)
因为当你这么做的时候

convert(int(round(number, -1)))

您正在调用
convert(50)
。由于您的
if
语句不包含50,因此它再次到达
else
,并再次调用
convert(50)
,以此类推。

这里的问题是
round(46,-1)
将生成值
50
。当使用值
50
调用
convert
时,它将转到完全相同的行

lettercount += convert(int(round(number, -1)))

round(50,-1)
调用将产生
50
,此时
convert
函数将无限执行

,因为
round(46,-1)
50
。提示:不要使用
len(numstr)是2
,使用
len(numstr)==2
因为如果两个对象位于同一个内存点上,则
is
仅返回
True
=
如果值相同,则返回
True
。@F3AR3DLEGEND对于2这样的简单整数,
is
测试将始终有效,因为它是一个不可变类型,所以它的所有实例都位于同一内存中。但是我同意,一般来说,
is
应该只在需要检查两个对象是否是同一个对象时使用。谢谢大家。我还发现我的代码中有一个错误;我总是需要四舍五入。是时候弄清楚了!haha@lxop:实际上,
is
测试只起作用,因为CPython引用解释器中的
int
缓存很小(这是一个实现细节)。不能保证
2
在任何其他Python解释器中都是单例的,也不能保证在未来的CPython版本中都是单例的,而且这绝对不是所有
int
s都是单例的问题(小型
int
缓存覆盖从
-5
256
IIRC的数字,因此对
257
的每次引用都会创建一个新的
257
)。