python - 考虑三个嵌套函数。最内层的函数可以访问最外层的命名空间吗?

标签 python function scope nested namespaces

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

>>> 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', 1, 2]
id 140601546763464
this also prints out f from f(): ['f', 1, 2]
id 140601546763464
据我所知,最里面的 x() 函数只能访问它自己的本地命名空间、封闭命名空间、全局命名空间,最后是内置命名空间。我最初认为尝试从函数 x() 访问函数 f() 中声明的列表 f 会引发错误,因为 f() 函数的命名空间不能归类为上述任何元素。运行程序后,我意识到您确实可以从函数 x() 访问列表 f。我不太明白这是如何工作的。我的猜测是,在一个几乎以递归方式工作的过程中,检查封闭命名空间不仅会检查封闭函数的本地命名空间,还会检查封闭函数的本地命名空间。有人可以解释一下这是如何工作的吗?

最佳答案

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

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

  • 封闭或非本地:
  • 存在于 nested functions
  • contains在封闭函数中定义的名称
  • visibleinnerenclosing职能。

  • 全局的:
  • contains在程序顶层定义的所有名称
  • visible从代码内部的任何地方。
  • exist贯穿整个代码的生命。

  • 内置:
  • created每当我们运行脚本时
  • contains Python 内置的关键字、函数、异常等
  • visible代码中随处可见

  • LEGB 规则是确定 Python 查找名称顺序的规则。
    即 Python 将在本地、封闭、全局和内置作用域中按顺序查找名称。和 inner scope代码可以outer scope名字不过 outer scope代码无法访问 inner scope名称。
    当我们使用嵌套函数时,作用域解析如下:
  • 检查局部作用域(函数内部)
  • 如果未找到,请检查从最内范围到最外范围的外部函数的封闭范围
  • 如果没有找到查看全局范围
  • 如果没有找到内置插件
  • 还是没有找到raise error
  • 关于python - 考虑三个嵌套函数。最内层的函数可以访问最外层的命名空间吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63487466/

    相关文章:

    python - 在Python中多次分割字符串

    Python Numpy - numpy 轴性能

    python - 为什么 python 列表的 x[False] 和 x[True] 有效?

    Jquery在自定义函数中调用回调函数

    java - 为什么当我尝试更改此 case 语句中的变量时,它不会更改该循环之外的变量

    python - conda 环境中的 Numba 测试失败

    r - 不创建 SpatialGridDataFrame 对象的函数

    mysql - 删除 MySQL 中的非字母数字

    javascript - 我应该如何在 javascript 中声明游标变量?

    javascript - 如何使用 jQuery 从外部函数访问内部函数的变量?