Skip to main content
 首页 » 编程设计

python之在 Python 中打印函数地址的奇怪行为

2025年05月04日13JustinYoung

我在 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