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

时间:2017-09-06 16:14:40

标签: python function printing function-address

我在 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函数的行为是奇数?

3 个答案:

答案 0 :(得分:3)

print()实际调用之前,print()的两个参数都已完全评估。由于主print()的第二个参数为fib(10),因此在此过程中使用参数fib调用10。由于它打印的东西,这些都在评估过程中打印出来。函数本身不包含return语句,因此返回None,这就是打印的原因。

答案 1 :(得分:3)

行为是正确的。只是在您致电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

答案 2 :(得分:1)

让我们打破这个。

首先我们来看看排序:

print(fib, fib(10))

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

fib(10)将自己进行一些打印,然后退出。在这种情况下,它不会显式返回值,因此被视为None

因此,上述打印调用可视为

print(fib, None)

这将导致打印功能地址,然后打印None