Python内层函数与全局函数重名时如何调用全局函数
问题代码
def A(): return 2 def B(): def A(): return 3 return A() print(B()) # 输出3
解答
完全可以,有两种常用实现方式:
- 方法1:使用
globals()内置函数直接获取全局作用域的A函数
修改后的B函数写法如下:
def B(): def A(): return 3 # 从全局作用域取A函数调用 return globals()['A']()
此时调用print(B())就会输出2。
- 方法2:在内层A函数定义前先给全局A函数做一个别名绑定
如果你不想每次都写globals(),可以在定义内层同名A之前先把全局A存到别的变量里:
def B(): # 先存全局A的引用,此时还没定义内层A,变量查找会找到全局的A global_A = A def A(): return 3 return global_A()
这种写法调用B()也会返回2。
Python查找变量的时候会遵循LEGB规则,优先从当前局部作用域(Local)找,找不到才会往上找闭包作用域(Enclosing)、全局作用域(Global)、内置作用域(Built-in)。你在B内部定义了同名的A之后,当前局部作用域已经有A了,所以默认会优先用内层的,只要你主动跳过局部作用域的查找,就能拿到全局的A函数。
内容的提问来源于stack exchange,提问作者Vinh Quang Tran
相关产品推荐
相关产品推荐

