python – 范围规则的简短描述?

Python范围规则究竟是什么?

如果我有一些代码:

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

找到x在哪里?一些可能的选择包括以下列表:

>在封闭的源文件中
>在类名称空间中
>在函数定义中
>在for循环索引变量中
>在for循环中

在执行期间,当函数垃圾邮件在其他地方传递时,也存在上下文.也许lambda functions传球有点不同?

某处必须有简单的参考或算法.对于中级Python程序员来说,这是一个令人困惑的世界.

最佳答案
实际上,从Learning Python, 3rd. Ed.开始,Python Scope解析的简明规则.(这些规则特定于变量名称,而不是属性.如果您在没有句点的情况下引用它,则适用这些规则)

LEGB规则.

L,Local – 在函数内以任何方式分配的名称(def或lambda)),并且在该函数中未声明为全局.

E,Enclosing-function locals – 从内到外的任何和所有静态封闭函数(def或lambda)的局部范围中的名称.

G,全局(模块) – 在模块文件的顶级分配的名称,或通过在文件中的def中执行全局语句.

B,内置(Python) – 在内置名称模块中预先分配的名称:open,range,SyntaxError,…

所以,在这种情况下

code1
class Foo:
   code2
   def spam.....
      code3
      for code4..:
       code5
       x()

for循环没有自己的命名空间.在LEGB顺序中,范围将是

L:本地,def垃圾邮件(代码3,代码4,代码5).

E:封闭函数,任何封闭函数(如果整个示例都在另一个def中)

G:全球.在模块(code1)中是否全局声明了x?

B:Python中的任何内置x.

在代码2中永远不会找到x(即使在您可能期望的情况下,也可以参见Antti’s answerhere).

转载注明原文:python – 范围规则的简短描述? - 代码日志