Python中如何避免函数引用的非局部变量随外部赋值变化?
解决Python闭包中循环变量引用导致的返回值一致问题
你遇到的是Python闭包里的经典陷阱:循环变量在闭包中是按引用捕获的,而非按值。当后续调用返回的inner函数时,循环早已结束,i的值固定为n-1,所以所有函数都会返回同一个结果。
你用默认参数的方法确实能解决问题,但确实不够优雅,这里有两种更清晰直观的替代方案:
方案一:用嵌套函数创建独立作用域
通过额外的嵌套函数make_inner来捕获每次迭代的i值,每次调用make_inner(i)时,i会进入该函数的局部作用域,inner引用的是这个局部作用域里的i,而非外层循环的变量:
def outer(n): res = [] def make_inner(i): def inner(): return i return inner for i in range(n): res.append(make_inner(i)) return res
方案二:使用functools.partial绑定参数
functools.partial可以帮你把参数预先绑定到函数上,生成一个新的可调用对象,彻底避免闭包对循环变量的依赖:
from functools import partial def outer(n): res = [] def inner(i): return i for i in range(n): res.append(partial(inner, i)) return res
这两种方法都没有引入不必要的默认参数,代码逻辑更清晰,测试后返回的每个函数都会依次返回0、1、2……n-1。
内容的提问来源于stack exchange,提问作者Jemtaly
相关产品推荐
相关产品推荐

