Python中能否调用嵌套于其他函数内的函数?含具体示例问询
在Python中能否调用其他函数内部定义的函数?
哈哈,这个问题问得很接地气!直接说结论:你没法直接在foo2()里调用foo()内部的bar(),核心原因是「作用域」的限制——就像你把零食藏在自己卧室的抽屉里,你室友(外部函数)没权限直接拿一样。
为啥直接调用不行?
嵌套在foo()里的bar(),它的作用域完全被包裹在foo()内部。只有当foo()被执行的时候,bar()才会被定义出来,而且外部的foo2()根本“看不到”这个函数的存在。如果你硬写foo2()里直接调用bar(),运行时会直接报NameError: name 'bar' is not defined的错误。
那怎么才能让foo2()调用到bar()?
有两种常用的方式可以实现,本质都是把bar()这个函数对象“带出”foo()的作用域:
方法1:让foo()返回bar函数本身
修改foo(),让它把内部的bar作为返回值,这样外部函数就能拿到bar的引用并调用它:
def foo(): def bar(): print("我是定义在foo里的bar函数!") return bar # 返回bar这个函数对象 def foo2(): # 调用foo()拿到bar的引用,赋值给my_bar my_bar = foo() my_bar() # 现在就能调用bar啦 foo2() # 执行后会打印:我是定义在foo里的bar函数!
这其实就是Python中闭包的基础用法——嵌套函数可以被外部获取并保留对父函数作用域的访问。
方法2:把bar()作为参数传递给foo2()
在foo()内部调用foo2()的时候,把bar作为参数传进去,这样foo2()就能通过参数调用它:
def foo(): def bar(): print("我是定义在foo里的bar函数!") foo2(bar) # 将bar函数作为参数传给foo2 def foo2(func): func() # 调用传入的bar函数 foo() # 执行后会触发foo2调用bar,打印对应内容
最后再啰嗦一句
如果foo()只是定义了bar()但既不返回它,也不把它传递给外部,那当foo()执行完毕后,bar()就会被Python的垃圾回收机制清理掉,外部永远没机会调用到它。
内容的提问来源于stack exchange,提问作者THN




