Python中improve函数如何与不同作用域的sqrt_update、sqrt_close交互?
Python中LEGB规则下函数参数的作用域问题解答
首先要搞清楚一个核心点:函数在Python里是对象,就像数字、字符串一样,可以作为参数传递。当你把sqrt_update和sqrt_close传给improve时,本质是把这两个函数的引用(相当于指向它们的“地址”)传给了improve,improve的局部作用域里会新增两个变量(比如update和close),它们直接指向那两个函数对象。
接下来拆解LEGB规则在这里的作用:
当
improve内部调用update(x)或者close(x)时,LEGB规则管的是被调用的那个函数(比如sqrt_update)内部的变量查找,而不是improve去查找sqrt_update的定义。举个实际的例子,如果
sqrt_update是嵌套在sqrt函数里定义的:def sqrt(n): def sqrt_update(x): return (x + n/x)/2 # 这里的n要找sqrt作用域里的n def sqrt_close(x): return abs(x*x - n) < 0.0001 return improve(sqrt_update, sqrt_close)当
improve调用update(x)时,sqrt_update内部要找变量n,会按照LEGB规则,先找自己的局部(没有),再找嵌套作用域(也就是sqrt函数的作用域,找到n),而不会去improve的局部作用域找。对
improve函数来说,它根本不需要关心sqrt_update和sqrt_close在哪定义的,只要拿到的是可调用的函数对象,并且符合调用要求(比如update接受一个参数,close返回布尔值),就能直接调用。
总结一下:
- 函数作为参数传递,传递的是函数的引用,
improve拿到后就能调用它。 - LEGB规则是给被调用的函数(
sqrt_update/sqrt_close)用的,用来找它们自己内部用到的变量,和improve的作用域无关。 - 简单说:
improve是“执行者”,它只负责调用传进来的函数;而传进来的函数自己内部的变量查找,按它们自己的LEGB规则来,和improve没关系。
内容的提问来源于stack exchange,提问作者ANewbie
相关产品推荐
相关产品推荐

