Python 的作用域

Python 的命名空间(namespace)包括:

  1. 内置的命名框架,包含内置的函数、变量、内置的异常
  2. module 的 global namespace
  3. 函数的局部 namespace

变量的作用域

作用域(scope) 是具体的代码段,namespace 投射到 scope,

如果要使用上层作用域的变量,需要用 nonlocal 声明,否则只是在当前作用域创建一个同名变量,声明全局变量使用 global:

spam = "" # 当前作用域中的变量 nonlocal spam # 上层作用域中的变量 global span # 全局作用域中的变量

示例:

def scope_test(): def do_local(): spam = "local spam" def do_nonlocal(): nonlocal spam spam = "nonlocal spam" def do_global(): global spam spam = "global spam" spam = "test spam" do_local() print("After local assignment:", spam) do_nonlocal() print("After nonlocal assignment:", spam) do_global() print("After global assignment:", spam) scope_test() print("In global scope:", spam)

运行输出为:

After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam

类中变量的作用域

类属性的作用域是类,该类的所有实例使用同一份类属性,实例属性作用域是单个实例,每个实例一份。

例如下面的 kind 是类属性,name 是实例属性:

class Dog: kind = 'canine' # class variable shared by all instances def __init__(self, name): self.name = name # instance variable unique to each instance >>> d = Dog('Fido') >>> e = Dog('Buddy') >>> d.kind # shared by all dogs 'canine' >>> e.kind # shared by all dogs 'canine' >>> d.name # unique to d 'Fido' >>> e.name # unique to e 'Buddy'