Python基本嵌套语句和范围概念

时间:2017-03-07 14:46:49

标签: python scope nested-function

def func():
    def nested():
        global x
        x = 1
x = 2
func()
print(x)

正确答案是' 2'原因是因为没有定义func()。但是当我读到它时,似乎func()被定义为嵌套()。我会认为当你调用func()然后会自动调用nested()。我正在努力抓住这一点并理解为什么我不应该这样读。

1 个答案:

答案 0 :(得分:4)

您在nested内定义了func,但您未在nested()的任何地方拨打func,因此当您致电{{1}时它实际上什么都不做。

要执行您想要的操作,请尝试将func()定义为:

func

更新:在StevenRumbalski的评论之后,我认为关于该功能究竟发生了什么的一点点补充可以帮助澄清周围的事情。

Python函数本身就是可以响应运算符def func(): def nested(): global x x = 1 nested() 的对象。 定义新函数时,您实际执行的操作是实例化一个函数对象并为其命名。在上面的示例中,()创建了一个函数实例并为其命名为func,因此当您将运算符def func()应用于func时(即当您使用()调用该函数时),代码为执行与该名称关联的功能。

现在让我们更进一步,看看func()会发生什么。 嵌套在func的范围内定义 ,因此当您退出func的范围时,不再定义嵌套的名称。 但是,如果您将函数对象返回给nested的调用者,则可以使用该对象运行func代码。

一个小例子:

nested

在这种情况下,如果我们这样做

def returning_func():
    def nested():
        print("I am nested!")
    return nested # note the lack of the () operator!

没有打印任何内容,因为已定义嵌套但未执行。 但是,如果我们称之为:

my_reference_to_nested = func()

我们执行嵌套代码并打印到输出my_reference_to_nested()