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

Nic*_*olò 3 python python-2.7 pdb

我正在使用pdb来调试程序.我先后点击'c'来运行代码,每一步pdb都显示我执行了哪一行.

假设我们有这个代码:

def foo(bar):
   print(bar)

foo('hey')
Run Code Online (Sandbox Code Playgroud)

首先,第4行调用函数foo.然后pdb告诉我这一行

def foo(bar)
Run Code Online (Sandbox Code Playgroud)

被执行.

为什么?这条线不仅仅是一种标签吗?执行"print(bar)"之前会发生什么?(伴随着另一个人的打击)

编辑:我试验做的事情是实际检查定义.事实上,在案件foo为发生器(即不能以这样的方式被称为)蟒蛇仍到那里,然后决定把它当作一台发电机(或根据情况的功能.).

Tim*_*ers 8

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

import dis
def f():
    def g():
        return 1
dis.dis(f)
Run Code Online (Sandbox Code Playgroud)

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

0 LOAD_CONST               1 (<code object g at 02852338, file ...>)
3 MAKE_FUNCTION            0
6 STORE_FAST               0 (g)
Run Code Online (Sandbox Code Playgroud)

所有这些通常都是一个看不见的细节,但你可以用它来玩一些模糊的技巧;-)例如,想想这段代码的作用:

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

这是输出:

[0, 1, 8]
Run Code Online (Sandbox Code Playgroud)

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