python当函数被调用时会发生什么?

我正在使用pdb来调试程序。 我连续击中'c'来运行代码,并且在每个步骤中,pdb显示执行哪条线。

假设我们有这样的代码:

def foo(bar):
   print(bar)

foo('hey')

首先,第4行调用函数foo。 然后pdb显示我的线

def foo(bar)

被执行。

为什么? 那不就是一种标签吗? “print(bar)”执行之前会发生什么? (随着另一个'命中)

编辑:我尝试做的事情是实际检查定义。 事实上,在foo是一个生成器(不能用这种方式调用)的情况下,python仍然会到达那里,然后决定将它作为一个生成器(或根据情况而定的函数)处理。


def不是Python中的声明,它是一个可执行语句。 在运行时,它检索为该函数编译的代码对象,将其包装在动态创建的函数对象中,并将结果绑定到def的名称。 例如,考虑这个无用的代码:

import dis
def f():
    def g():
        return 1
dis.dis(f)

以下是输出的一部分(这里是Python 2.7.5):

0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)

所有这些通常都是一个无形的细节,但是你可以用它来玩一些晦涩的技巧;-)例如,想想这个代码的作用:

fs = []
for i in range(3):
    def f(arg=i**3):
        return arg
    fs.append(f)
print [f() for f in fs]

这是输出:

[0, 1, 8]

这是因为可执行文件def创建三个不同的函数对象,每次通过循环都有一个。 非常有趣 :-)


“print(bar)”执行之前会发生什么?

这只是一个受过教育的猜测:我想当前的IP被压入堆栈,然后是参数。 然后创建一个新的堆栈框架,参数从堆栈弹出并添加为当地的当前范围。 沿着这条线的东西。

链接地址: http://www.djcxy.com/p/4889.html

上一篇: python what happens when a function is called?

下一篇: How to make Python Wait for input?