def func():
def nested():
global x
x = 1
x = 2
func()
print(x)
正确答案是“2”,原因是 func() 未定义。但是当我读到这篇文章时,似乎 func() 被定义为 nested()。我认为当您调用 func() 时,它会自动调用 nested()。我正在努力理解这一点并理解为什么我不应该那样阅读它。
最佳答案
您正在定义 nested
里面func
, 但你没有调用 nested()
func
中的任意位置, 所以当你调用 func()
它实际上什么都不做。
做你想做的尝试定义func
作为:
def func():
def nested():
global x
x = 1
nested()
更新:在 StevenRumbalski 的评论之后,我认为对该函数中到底发生了什么的一个小补充可以帮助澄清周围的事情。
Python 的函数本身就是可以响应运算符()
的对象。 .
当您定义一个新函数时,您实际上是在实例化一个函数对象并为其命名。在上面的示例中,def func()
创建一个函数实例并将其命名为 func,这样当您应用运算符 ()
时到 func(即当您使用 func()
调用函数时)执行与该名称关联的函数的代码。
现在让我们更进一步,看看 nested
会发生什么.
Nested 是在 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()
没有打印任何内容,因为 nested 已定义但未执行。 但是,如果我们调用它:
my_reference_to_nested()
我们执行 nested 的代码并打印到输出 I am nested!
关于Python 基本嵌套语句和作用域概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651232/