Python:不修改函数,能否通过返回值p获取内部局部变量midres?
如何在不修改函数的前提下获取内部局部变量midres?
首先得明确一个核心前提:Python函数执行完毕后,内部的局部变量会被垃圾回收机制清理——除非有外部引用还指着它。所以能不能通过p拿到midres,完全取决于p和midres之间有没有引用绑定关系。
我分两种常见场景给你拆解:
场景1:p是引用了midres的闭包函数
如果你的test函数是类似下面的闭包结构(p作为内部函数引用了midres):
def test(): midres = [4,9] def p(): # 这里引用了midres,让闭包捕获它 return midres return p
这时候midres会被闭包p保留引用,你可以通过Python函数的底层属性__closure__来获取:
p = test() # __closure__是一个元组,每个元素对应闭包捕获的变量 midres = p.__closure__[0].cell_contents print(midres) # 输出: [4,9]
注意:__closure__里元素的顺序和函数捕获变量的顺序一致,如果捕获了多个变量,你需要对应调整索引。
场景2:p和midres没有任何引用关系
如果p和midres完全没关系(比如test里只是定义了midres,然后返回一个和它无关的p):
def test(): midres = [4,9] p = "some random value" return p
这种情况下,test执行完毕后midres就被直接销毁了,没有任何引用指向它,完全没办法再获取到它——因为内存里已经没有这个变量的踪迹了。
为什么p.midres无效?
因为midres只是test函数的局部变量,你没有在test里把它绑定为p的属性(比如p.midres = midres),所以p根本不知道这个变量的存在,自然访问不到。而你又不能修改test函数,所以这条路走不通。
内容的提问来源于stack exchange,提问作者P. Prunesquallor
相关产品推荐
相关产品推荐

