Python 作用域规则到底是什么?
如果我有一些代码:
code1
class Foo:
code2
def spam.....
code3
for code4..:
code5
x()
x
在哪里找到?一些可能的选择包括以下列表:
- 在随附的源文件中
- 在类命名空间中
- 在函数定义中
- 在for循环索引变量中
- for 循环内部
当函数 spam
被传递到其他地方时,执行期间也存在上下文。也许lambda functions通过有点不同?
某处一定有一个简单的引用或算法。对于中级 Python 程序员来说,这是一个令人困惑的世界。
最佳答案
其实是Python作用域解析的一个简明规则,来自Learning Python, 3rd. Ed. 。 (这些规则特定于变量名,而不是属性。如果您引用时不带句点,则适用这些规则。)
LEGB规则
Local - 在函数内以任何方式分配的名称(
def
或lambda
),并且未在该函数中声明为全局的功能Enending-function - 在任何和所有静态封闭函数的本地范围内分配的名称(
def
或lambda
) ,从内到外Global(模块)——在模块文件顶层分配的名称,或者通过在
def 中执行
文件内global
语句分配的名称Built-in (Python) — 在内置名称模块中预先分配的名称:
open
、range
、语法错误
等
所以,在这种情况下
code1
class Foo:
code2
def spam():
code3
for code4:
code5
x()
for
循环没有自己的命名空间。按照 LEGB 顺序,范围为
- L:
def spam
中的本地(在code3
、code4
和code5
中) - E:任何封闭函数(如果整个示例位于另一个
def
中) - G:模块中(
code1
)中是否有全局声明的x
? - B:Python 中的任何内置
x
。
x
永远不会在 code2
中找到(即使在您可能期望的情况下,请参阅 Antti's answer 或 here)。
关于python - 范围规则的简短描述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54052137/