函数指针能否访问自身作用域外的数据?Python嵌套函数作用域疑问
问题解答:Python嵌套函数的变量引用机制
Python 没有传统 C/C++ 里的「函数指针」概念,你观察到的特性是 Python 的**闭包(Closure)**机制,嵌套定义的函数会自动保留外层作用域中用到的变量引用,不受外层函数生命周期的限制。
代码运行逻辑拆解
- 调用
create_function(object)时,形参data会被赋值为你传入的内置object类,此时内层函数new_function的定义中引用了外层的data变量,Python 会自动将data绑定到new_function的闭包存储结构中,不会因为create_function执行结束就销毁data的引用。 create_function执行完成后,返回的new_function赋值给全局变量test_func,此时test_func已经独立持有当时传入的data的引用,不需要依赖外层函数的上下文就可以在任意位置调用,调用时可以正常访问绑定的data值。- 注:你给出的示例代码直接传入了内置
object类,它本身没有member属性,实际调用test_func时会抛出AttributeError,测试时建议传入自定义的带member属性的类/实例,如下是可运行的验证示例:
class TestObj: def __init__(self, member): self.member = member def create_function(data): def new_function(other_data): if data.member == 0: other_data.member += 1 return new_function # 传入自定义实例 my_data = TestObj(0) test_func = create_function(my_data) # 此时create_function已经执行完毕,test_func依然可以正常访问绑定的my_data other_data = TestObj(2) test_func(other_data) print(other_data.member) # 输出3,逻辑正常执行
验证闭包持有变量的方法
你可以直接打印函数的__closure__属性查看绑定的外层变量:
# 输出的cell_contents就是当时传入的my_data实例 print(test_func.__closure__[0].cell_contents)
内容的提问来源于stack exchange,提问作者Mason Woodford
相关产品推荐
相关产品推荐

