考虑三个嵌套函数最内层函数可以访问最外层函数的命名空间吗? 本地范围:封闭式或非本地式全局:内置:

问题描述

我用自己编写的程序对此进行了测试:

>>> def f():
    f=['f',1,2]
    def g():
         g=1
         print('this prints out f from f(): ',f)
         print("id",id(f))
         def x():
              x=1
              print('this also prints out f from f():',f)
              print('id',id(f))
         x()
    g()

>>> f()#output
this prints out f from f():  ['f',2]
id 140601546763464
this also prints out f from f(): ['f',2]
id 140601546763464

据我了解,最里面的x()函数只能访问其自己的本地名称空间,封闭的名称空间,全局名称以及最后的内置名称空间。我最初认为,尝试从函数x()访问函数f()中声明的列表f会引发错误,因为f()函数的名称空间无法归类为上述任何元素。运行该程序后,我意识到您确实可以从函数x()访问列表f。我不太明白这是如何工作的。我的猜测是,检查封装名称空间不仅会检查封装功能的本地名称空间,而且还会检查封装功能的本地名称空间,而这个过程几乎可以递归地工作。有人可以解释一下它是如何工作的吗?

解决方法

Python使用names规则解析LEGB :( LEGB表示本地,封闭,全局和内置)

本地范围:

  • contains定义的名称inside the function
  • visibleinside函数
  • created在函数call(如果多次调用该函数,则每次调用都会创建新的本地作用域)
  • 一旦功能destroyed
  • 将是return

封闭式或非本地式

  • 存在nested functions
  • 封闭函数中定义的
  • contains名称
  • visibleinner函数中的enclosing

全局:

  • contains在程序顶层定义的所有名称
  • visible来自代码内的任何地方。
  • exist缩短了代码的使用寿命。

内置:

  • created每当我们运行脚本时
  • Python内置的
  • contains关键字,函数,异常等
  • visible在代码中的任何地方

LEGB规则是确定Python查找名称的顺序的规则。 即Python将在本地,封闭,全局和内置范围内依次查找名称。 inner scope代码可以使用outer scope个名称,但是outer scope代码不能访问inner scope个名称。

当我们使用嵌套函数时,作用域解析如下:

  1. 检查本地作用域(在函数内部)
  2. 如果未找到,请检查外部函数从最内层到最外层的范围
  3. 如果找不到,请查看全局范围
  4. 如果未找到,则看起来是内置的
  5. 仍未找到raise error

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...