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

2024-04-20 11:04:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

代码打印,其行为很奇怪

为什么print函数的行为是奇怪的


Tags: 函数代码nonedeffunctionatendprint
3条回答

让我们把它分解一下

首先我们来看看订单:

print(fib, fib(10))

首先计算对fib的调用,并将其返回值传递给print函数

fib(10)将自己进行一些打印,然后退出。在本例中,它没有显式返回值,因此被视为None

因此,上述要求印刷可以看作是

print(fib, None)

这将导致打印函数地址,然后None

在实际调用print()之前,对print()的两个参数进行完全求值。因为主print()的第二个参数是fib(10),所以在这个过程中,用参数10调用fib。因为它会打印东西,这些东西会在评估过程中打印出来。函数本身不包含return语句,因此它返回None,这就是为什么要打印它

行为是正确的。只是fib(10)是在调用print之前执行的。这是因为函数调用的参数必须在传递给函数之前执行

所以事实上,您确实要计算fib(10)(包括函数中的所有print),然后打印fibfib(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

相关问题 更多 >