给出下面的代码,我不明白为什么f和fib的行为不同。取自巴克利cs61a课程的例子
def fib(n):
if n==1 or n==0:
return n
else:
return fib(n-1) + fib(n-2)
def decor(f):
def counted(*args):
counted.call_count += 1
return f(*args)
counted.call_count = 0
return counted当我将代码加载到解释器中时,我得到了以下输出:
>>> fib(6)
8
>>> f = decor(fib)
>>> fib = decor(fib)
>>> # f and fib are both vars that represents a decorated fib function
>>> f(6)
8
>>> f.call_count # why 1 ???
1
>>>
>>> fib(6)
8
>>> fib.call_count # 49 calls, that's fine
49发布于 2016-07-23 19:41:14
f.call_count是1,因为f调用fib,然后fib递归地调用自己来计算结果。在整个过程中,f只被调用一次。
但是当您执行fib = decor(fib)时,您将覆盖全局范围内的fib函数,因此从那时起,fib将递归地调用修饰后的fib。
发布于 2016-07-23 19:45:06
您正在覆盖fib,然后f调用fib而不是它自己:
def fib(n):
if n==1 or n==0:
return n
else:
print("fib is: " + repr(fib))
return fib(n-1) + fib(n-2)
def decor(f):
def counted(*args):
counted.call_count += 1
return f(*args)
counted.call_count = 0
return counted
f = decor(fib)
fib = decor(fib)
print("=== f ===")
print(f(6))
print(f.call_count)
print("=== fib ===")
print(fib(6))
print(fib.call_count)当我运行这个命令时,输出是:
=== f ===
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
8
1
=== fib ===
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
fib is: <function counted at 0x7fa844639758>
8
49请注意,fib is始终在0x7fa844639758上运行。
https://stackoverflow.com/questions/38541296
复制相似问题