我在 Python 中编写了以下代码:
def fib(n):
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a + b
print(fib, fib(10))
我认为正确的输出应该是:
<function fib at 0x000001DF4BB13E18> 1 1 2 3 5 8
但是输出是:
1 1 2 3 5 8 <function fib at 0x000001C60F823E18> None
代码打印None 并且它的行为很奇怪。
为什么 print 函数的行为很奇怪?
请您参考如下方法:
行为是正确的。只是 fib(10) 在调用 print 之前执行。这是因为函数调用的参数必须在传递给函数之前执行。
所以实际上你确实计算了 fib(10)(包括函数内的所有 print)然后打印 fib 和fib(10) 调用的结果(它是 None,因为您的 fib 函数不包含显式的 return)。
您还可以调用 dis.dis 来查看求值顺序:
def f():
print(fib, fib(10))
import dis
dis.dis(f)
结果:
10 0 LOAD_GLOBAL 0 (print)
2 LOAD_GLOBAL 1 (fib)
4 LOAD_GLOBAL 1 (fib)
6 LOAD_CONST 1 (10)
8 CALL_FUNCTION 1 ----> the fib(10) call
10 CALL_FUNCTION 2 ----> the print call
^------- number of arguments!
12 POP_TOP
14 LOAD_CONST 0 (None)
16 RETURN_VALUE
