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

python what happens when a function is called?

我正在使用PDB调试程序。我连续点击"c"来运行代码,在每一步,pdb都会显示执行哪一行。

假设我们有这个代码:

1
2
3
4
def foo(bar):
   print(bar)

foo('hey')

首先,第4行调用函数foo。然后PDB给我看线路

1
def foo(bar)

执行。

为什么?那条线不是标签吗?在执行"打印(栏)"之前会发生什么?(那是另一个"的"命中)

编辑:我试着做了一些事情来检查定义。事实上,在foo是一个生成器的情况下(不能这样调用),python仍然会到达那里,然后决定将其视为一个生成器(或者视情况而定的函数)。


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

1
2
3
4
5
import dis
def f():
    def g():
        return 1
dis.dis(f)

下面是输出的一部分(这里是python 2.7.5):

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

所有这些通常都是不可见的细节,但您可以用它来玩一些模糊的把戏;-)例如,考虑一下此代码的作用:

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

输出结果如下:

1
[0, 1, 8]

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


What happens before"print(bar)" is executed?

这只是一个有根据的猜测:我想当前的IP被推到堆栈上,然后是参数。然后创建一个新的堆栈框架,从堆栈中弹出参数并将其作为局部变量添加到当前作用域中。沿着这条线。