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

解释: 动态作用域依赖于调用的上下文,而静态作用域依赖于文本中的上下文。

这些代码示例提供了局部和全局变量的概念、globalnonlocal关键字的使用,以及命名空间查找顺序的详细说明。您可以在本地环境中执行这些代码来验证输出。

4-1-2.png