有趣的问题。 从Python bytecode来看有细微的差别。
以下是用Python2.7跑的实验。
结果是第一个写法多了一些东西,
但我猜很难对效能产生大影响。
===
实验一
import dis
def f(i):
if i == 0: return
print(i)
f(i-1)
dis.dis(f)
实验二
import dis
def f(i):
if i == 0: return
print(i)
return f(i-1)
dis.dis(f)
结果一
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 POP_TOP
35 LOAD_CONST 0 (None)
38 RETURN_VALUE
结果二
4 0 LOAD_FAST 0 (i)
3 LOAD_CONST 1 (0)
6 COMPARE_OP 2 (==)
9 POP_JUMP_IF_FALSE 16
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
5 >> 16 LOAD_FAST 0 (i)
19 PRINT_ITEM
20 PRINT_NEWLINE
6 21 LOAD_GLOBAL 0 (f)
24 LOAD_FAST 0 (i)
27 LOAD_CONST 2 (1)
30 BINARY_SUBTRACT
31 CALL_FUNCTION 1
34 RETURN_VALUE
※ 引述《sunnoset (skj)》之铭言:
: f(10)
: 和
: def f(i):
: if i == 0: return
: print(i)
: return f(i-1)#加上return
: f(10)
: 执行结果一样
: 10
: 9
: 8
: 7
: 6
: 5
: 4
: 3
: 2
: 1
: 但我好奇在背景是否有差别呢?
: 谢谢指教