在 Python 中,作用域决定了变量的可见性和生命周期。Python 主要有以下四种作用域:
1. 局部作用域(Local Scope):
- 在函数或方法内部定义的变量属于局部作用域。
- 这些变量只能在函数或方法内部访问。
python">def my_function():x = 10 # 局部变量print(x)my_function()# print(x) # 这里会报错,因为 x 在函数外部不可见
2. 嵌套作用域(Enclosing Scope):
- 在嵌套函数中,外层函数的变量对内层函数可见。
- 内层函数可以访问外层函数的变量,但不能直接修改(除非使用 `nonlocal` 关键字)。
python"> def outer():y = 20 # 嵌套作用域变量def inner():print(y) # 内层函数可以访问外层函数的变量inner()outer()
3. 全局作用域(Global Scope):
- 在模块级别定义的变量属于全局作用域。
- 全局变量在整个模块中都可以访问,但在函数内部修改全局变量需要使用 `global` 关键字。
python"> z = 30 # 全局变量def my_function():global zz = 40 # 修改全局变量print(z)my_function()print(z) # 输出 40,全局变量已被修改
4. 内置作用域(Built-in Scope):
- 包含 Python 内置的函数和对象,如 `print`、`len` 等。
- 这些名称在任何地方都可以访问,除非被局部或全局作用域中的同名变量覆盖。
python"> print(len("hello")) # 使用内置函数 lendef my_function():len = 10 # 局部变量覆盖了内置函数 lenprint(len)my_function()print(len("hello")) # 内置函数 len 仍然可用
作用域查找顺序
当访问一个变量时,Python 会按照以下顺序查找:
1. 局部作用域(Local Scope)
2. 嵌套作用域(Enclosing Scope)
3. 全局作用域(Global Scope)
4. 内置作用域(Built-in Scope)
如果找不到变量,Python 会抛出 `NameError` 异常。
总结
- 局部作用域:函数内部的变量。
- 嵌套作用域:外层函数的变量对嵌套函数可见。
- 全局作用域:模块级别的变量。
- 内置作用域:Python 内置的函数和对象。
当我们理解这些作用域之后能够有助于我们更好地管理变量和避免命名冲突。