3.3.1. 什么是命名空间?
命名空间是程序中变量名的集合,它们仅在特定的代码区域内存在,而不会影响整个程序。
变量的作用域(scope)指的是变量在程序中可访问的范围。如果变量在某个位置不存在,则它超出了作用域。
你可以把命名空间想象成程序中的“空间”,其中存放着变量名。
3.3.2. 命名空间的作用
不同的命名空间可以包含相同的变量名,但在不同的上下文中,它们的值可以不同。例如:
- 全局命名空间:存储程序顶层的变量。
- 局部命名空间:存储函数内部的变量。
3.3.3. 全局命名空间(Global Namespace)
全局命名空间存储所有的全局变量,即在整个程序范围内可用的变量。
示例:
# 全局命名空间global_var=10other_var=20此时,global_var和other_var都存储在全局命名空间中。
3.3.4. 局部命名空间(Local Namespace)
函数内部的变量属于局部命名空间,它们仅在函数执行期间存在。
defmy_function(x):y=x+1# 局部变量returny在my_function(4)调用时:
x = 4y = x + 1 = 5
但y仅在my_function内部有效。
3.3.5. 作用域的查找顺序(LEGB 规则)
当 Python 查找变量时,它会按以下顺序查找:
- 局部作用域(Local):当前函数内部的变量。
- 封闭作用域(Enclosing):外层函数的变量(适用于嵌套函数)。
- 全局作用域(Global):模块级变量。
- 内建作用域(Built-in):Python 内置变量,如
print。
示例:
global_var=10# 全局变量defmy_function():local_var=5# 局部变量print(global_var+local_var)local_var仅在my_function内部有效。global_var在整个程序中可用。
3.3.6. 变量的查找过程
如果一个变量在当前作用域不存在,Python 会向上查找,直到找到该变量。
global_var=10defmy_function():y=global_var+1# 查找 global_varprint(y)my_function()# 输出 11Python 发现global_var不在函数内,于是向上查找,找到了全局变量global_var。
3.3.7. 局部变量不会影响全局变量
如果在函数内部定义了与全局变量同名的变量,它们是不同的变量。
global_var=10defmy_function():global_var=5# 这是局部变量,不影响全局变量print("Inside function:",global_var)my_function()print("Outside function:",global_var)输出:
Inside function: 5 Outside function: 103.3.8. 修改全局变量(global 关键字)
如果你想在函数内部修改全局变量,需要使用global关键字。
global_var=10defmy_function():globalglobal_var# 允许修改全局变量global_var=5my_function()print(global_var)# 输出 53.3.9. 嵌套作用域(nonlocal 关键字)
在嵌套函数中,如果想修改外部函数的变量,可以使用nonlocal关键字。
defouter():x=10# 外部函数变量definner():nonlocalx# 修改外部函数变量x+=5print("Inside inner:",x)inner()print("Inside outer:",x)outer()输出:
Inside inner: 15 Inside outer: 153.3.10 总结
- 命名空间存储变量名,它们有不同的作用域。
- 全局命名空间包含所有全局变量,局部命名空间包含函数内部的变量。
- Python 按 LEGB 规则查找变量,先查找局部变量,再逐级向上查找。
- 局部变量不会影响全局变量,除非使用
global关键字。 - 嵌套函数可使用
nonlocal关键字修改外部函数的变量。