实际上,从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 answer或here).