2.18 命名空间与作用域
2.18.1 局部与全局变量
2.18.1.1 局部变量的定义与作用
def func():
local_var = "I am a local variable"
print(local_var)
func()
# print(local_var) # 这将引发错误,因为local_var是局部变量
输出:
I am a local variable
解释: local_var
只在func
函数内部定义和可用。
2.18.1.2 全局变量的定义与作用
global_var = "I am a global variable"
def func():
print(global_var)
func()
输出:
I am a global variable
解释: global_var
在函数外部定义,可以在整个模块中访问。
2.18.1.3 在函数内部使用全局变量
global_var = "I am a global variable"
def func():
global global_var
global_var = "Changed global variable"
func()
print(global_var)
输出:
Changed global variable
Changed global variable
解释: 使用global
关键字在函数内部修改全局变量。
2.18.1.4 变量在不同作用域中的生命周期
def func():
local_var = "Local variable"
return local_var
result = func()
print(result) # 可以访问局部变量的返回值
# print(local_var) # 这将引发错误,因为local_var不在外部作用域
输出:
Local variable
解释: 局部变量local_var
只在func
函数内部存在。
2.18.1.5 局部变量与全局变量的冲突与覆盖
global_var = "I am global"
def func():
global_var = "I am local"
print(global_var)
func()
print(global_var)
输出:
I am local
I am local
解释: 在函数内部,global_var
被重新定义为局部变量,覆盖了全局变量。
2.18.1.6 作用域对变量访问的影响
def outer_func():
def inner_func():
print(inner_var) # 访问内部函数的局部变量
inner_var = "Inner function variable"
inner_func()
outer_var = "Outer function variable"
def outer_func():
print(outer_var) # 访问外部函数的局部变量
输出:
Outer function variable
解释: 内部函数可以访问外部函数的局部变量,但外部函数不能访问内部函数的局部变量。
2.18.2 global和nonlocal关键字
2.18.2.1 global关键字的作用
global_var = "Initial global"
def func():
global global_var
global_var = "Modified global"
func()
print(global_var)
输出:
Modified global
解释: global
关键字允许在函数内部访问和修改全局变量。
2.18.2.2 nonlocal关键字的作用
def outer_func():
outer_var = "Outer variable"
def inner_func():
nonlocal outer_var
outer_var = "Modified outer variable"
inner_func()
print(outer_var)
outer_func()
输出:
Modified outer variable
解释: nonlocal
关键字允许在嵌套函数内部访问和修改外层函数的变量。
2.18.2.3 global与nonlocal的区别与使用场景
# global用于全局变量
def func():
global global_var
global_var = "Global"
# nonlocal用于嵌套函数中的变量
def outer():
def inner():
nonlocal outer_var
outer_var = "Nonlocal"
outer_var = "Outer"
inner()
return outer_var
print(func()) # 修改全局变量
print(outer()) # 修改外层函数变量
输出:
Global
Nonlocal
解释: global
用于全局变量,nonlocal
用于嵌套函数中的变量。
2.18.3 命名空间的查找顺序
2.18.3.1 LEGB规则(Local, Enclosing, Global, Built-in)
def func():
print(local_var) # Local
def outer_func():
def inner_func():
print(outer_var) # Enclosing
outer_var = "Outer variable"
def print_global():
print(global_var) # Global
print(len) # Built-in
outer_func()
print_global()
print(len)
输出:
Outer variable
Global
len
解释: Python按照LEGB的顺序查找变量。
2.18.3.2 局部作用域(Local)查找
def func():
local_var = "Local variable"
print(local_var)
func()
输出:
Local variable
2.18.3.3 嵌套作用域(Enclosing)查找
def outer():
outer_var = "Outer variable"
def inner():
print(outer_var)
inner()
outer()
输出:
Outer variable
2.18.3.4 全局作用域(Global)查找
global_var = "Global variable"
def func():
print(global_var)
func()
输出:
Global variable
2.18.3.5 内建作用域(Built-in)查找
print(len)
输出: 显示len
函数的文档字符串。
2.18.3.6 命名空间查找的顺序与优先级
def func():
local_var = "Local"
print(local_var)
print(global_var)
local_var = "Enclosing"
global_var = "Global"
func()
输出:
Local
Global
2.18.3.7 globals()与locals()函数的使用
def func():
local_var = "Local"
print(locals()['local_var'])
print(globals()['global_var'])
local_var = "Enclosing"
global_var = "Global"
func()
输出:
Local
Global
2.18.3.8 动态作用域与静态作用域的比较
def dynamic_scope():
def inner():
print(x)
x = "Dynamic"
inner()
def static_scope():
def inner():
print(locals()['x'])
x = "Static"
inner()
dynamic_scope() # 动态作用域
static_scope() # 静态作用域
输出:
Dynamic
Static
解释: 动态作用域依赖于调用的上下文,而静态作用域依赖于文本中的上下文。
这些代码示例提供了局部和全局变量的概念、global
和nonlocal
关键字的使用,以及命名空间查找顺序的详细说明。您可以在本地环境中执行这些代码来验证输出。