【发布时间】:2014-03-29 11:48:24
【问题描述】:
我有一个与程序行为变化有关的问题 return 语句的缺失导致在 python 方法中。
下面的 count 方法打印给定整数中的位数。 使用下面的代码块,我得到的结果为 4,即 预期的结果。
def count(x,acc=0):
if x==0:
return acc
return count(x/10,acc+1)
print "Count is %s" %(count(1234))
结果: 计数为 4
如果我修改上述方法,使最后一条语句不包含 'return' 语句我得到的结果是'None'。
def count(x,acc=0):
if x==0:
return acc
count(x/10,acc+1)
print "Count is %s" %(count(1234))
结果:计数为零
(我使用的Python版本是:2.7.3)
上述行为是否是由于 Python 没有进行尾调用优化,还是涉及其他任何原因?
perl 中的类似代码块(AFAIK 不进行尾调用优化)提供 最后一条语句中没有“return”的预期结果。
sub counter {
my ($n,$acc) = @_;
return $acc if ($n==0);
counter(int($n/10), $acc+1);
}
print "Count is:" . counter(1234,0) ."\n"
结果:计数为:4
(我在代码块上面运行的 Perl 版本是:5.14.4 和 5.8.5)。
我的问题是:
- 尾调用优化是否是上述 Python 代码块中显示的行为的原因。
- 如果是这种情况,那么为什么 perl 代码的行为会有所不同,这也不会造成 TCO。
【问题讨论】:
-
一个更好的类比可能是,如果 Python 在没有显式返回语句的情况下到达函数的末尾,就好像你有没有参数的“return”。因此,您正在返回但没有指定返回值(返回 None)。