You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数指针能否访问自身作用域外的数据?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:06:05