我用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:
让我们把它分解一下
首先我们来看看订单:
首先计算对fib的调用,并将其返回值传递给print函数
fib(10)将自己进行一些打印,然后退出。在本例中,它没有显式返回值,因此被视为
None
因此,上述要求印刷可以看作是
这将导致打印函数地址,然后
None
在实际调用
print()
之前,对print()
的两个参数进行完全求值。因为主print()
的第二个参数是fib(10)
,所以在这个过程中,用参数10
调用fib
。因为它会打印东西,这些东西会在评估过程中打印出来。函数本身不包含return
语句,因此它返回None
,这就是为什么要打印它行为是正确的。只是
fib(10)
是在调用print
之前执行的。这是因为函数调用的参数必须在传递给函数之前执行所以事实上,您确实要计算
fib(10)
(包括函数中的所有print
),然后打印fib
和fib(10)
调用的结果(这是None
,因为fib
函数不包含显式的return
)也可以调用
dis.dis
查看求值顺序:结果:
相关问题 更多 >
编程相关推荐