Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python调用函数时会发生什么?_Python_Python 2.7_Pdb - Fatal编程技术网

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

python调用函数时会发生什么?,python,python-2.7,pdb,Python,Python 2.7,Pdb,我正在使用pdb调试一个程序。我连续点击“c”来运行代码,在每一步pdb都会显示执行哪一行 假设我们有以下代码: def foo(bar): print(bar) foo('hey') 首先,第4行调用函数foo。然后pdb给我看线路 def foo(bar) 被执行 为什么??那条线不就是一种标签吗?在执行“打印(条形)”之前会发生什么?(这是伴随着另一个“打击”而来的) 编辑:我做了一些实验,实际上是检查定义。事实上,在foo是一个生成器的情况下(不能以这种方式调用),pytho

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

假设我们有以下代码:

def foo(bar):
   print(bar)

foo('hey')
首先,第4行调用函数foo。然后pdb给我看线路

def foo(bar)
被执行

为什么??那条线不就是一种标签吗?在执行“打印(条形)”之前会发生什么?(这是伴随着另一个“打击”而来的)

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

在执行“打印(条形)”之前会发生什么


这只是一个有根据的猜测:我假设当前IP被推到堆栈上,然后是参数。然后创建一个新的堆栈框架,从堆栈中弹出参数,并将其作为局部变量添加到当前范围。类似于这一行的东西。

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

import dis
def f():
    def g():
        return 1
dis.dis(f)
以下是部分输出(此处为Python 2.7.5):

以下是输出:

[0, 1, 8]

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

问得好!我期待着阅读答案。不过,我想说,如果它真的跳过了,那就更令人惊讶了。否则它将如何验证参数等?(如果它跳过了,如果你打电话给
foo(1,2)
,它怎么知道投诉呢?)是的,但我需要确切地知道那里发生了什么。你@rogaos可能是对的。。但是,在您建议pdb在foo(1,2)处停止执行,并且永远不会到达def行的情况下。因此,当我们看到def行时,它已经接受/匹配了功能。请注意,下一个“s”命中到达打印行,它总是在执行该行之前停止。因此,您可以在函数中发生任何事情之前检查堆栈/堆。听起来很合理。现在,我面临一个特殊的情况,函数的def行出现了问题。节目到了那里。。不执行该函数!只有在使用pdb时,我才注意到消息“GeneratorExit:None”。那么,你猜这一步会出什么问题吗?请注意,我试图用一个简单的例子来重现这个问题,同时它本身似乎是一个有趣的问题,我发布了它。所以,我的是一个生成器,而不是一个经典函数。因此,它做的一件事就是检查它是什么。
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]