gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:55:27 36 4
gpt4 key购买 nike

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

>>> 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/

    36 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com