Python 作用域基础全解析
1. Python 作用域规则下的名称分类
在 Python 里,模块及其包含的函数会使用多个名称来完成相应操作。依据 Python 的作用域规则,可将这些名称分类如下:
- 全局名称 :像 X
和 func
就属于全局名称。 X
是全局的,因为它是在模块文件的顶层被赋值的,在函数内部可以直接以无修饰变量的形式引用它,无需声明为全局变量。 func
同理, def
语句在模块顶层把一个函数对象赋值给了名称 func
。
- 局部名称 : Y
和 Z
是函数的局部名称(仅在函数运行时存在),因为它们都在函数定义中被赋值。 Z
通过 =
语句赋值,而 Y
是因为参数总是通过赋值传递的。
这种名称隔离方案的基本原理是,局部变量作为临时名称,仅在函数运行时才需要。例如,在前面的例子中,参数 Y
和加法结果 Z
仅存在于函数内部,这些名称不会干扰外部模块的命名空间(或者其他函数的命名空间)。实际上,当函数调用结束时,局部变量会从内存中移除,如果它们引用的对象在其他地方没有被引用,就可能会被垃圾回收。这是一个自动的内部步骤,有助于最小化内存需求。
局部和全局名称的区分也让函数更易于理