2.21【命名空间与作用域】

2023-12-15 19:04:17

命名空间与作用域

命名空间是一个用于存储和组织变量名或标识符的系统,它可以帮助我们避免命名冲突和管理代码中的标识符。

内建命名空间

内建设命名空间包含了 Python 的内置函数和对象,例如 print()len()strmax()

全局命名空间

全局命名空间指的是定义在程序中所有作用域之外的变量

global a = 'hello'

def test():
    print(a)
    
 
test() # hello

局部命名空间

局部命名空间是指在函数或类中定义的变量、函数和类的集合,它们仅在函数或类的作用域内可见和访问

def my_function():
    a = 10
    
    def nested_function():
        a = 20
        
        print("a:", a) # 20
    
    nested_function()
    
    print("a:", a) # 20

my_function()

名称空间的加载顺序

  • 内置名称空间->全局名称空间->局部名称空间,
  • 而查找一个名字,必须从三个名称空间之一找到,查找顺序为:
  • 局部名称空间->全局名称空间->内置名称空间。

变量作用域

  • 变量的作用域
    • Python是静态作用域,也就是说Python中,变量的作用域源于它在代码中的位置
    • 在不同的位置,可能有不同的命名空间。命名空间是变量作用域的体现形式
  • python变量作用域一般有4种:
    • Local(局部变量)
    • Enclosed(嵌套)
    • Global(全局)
    • Built-in(内置)

【1】Local(局部变量)

def fun():
    # 只有在函数内部的变量
    b = 2	# 此处的2就是局部变量
    print(b)  # 输出2


fun()
# 调用函数后,发现找不到变量 b 是因为在全局作用域中找不到 变量 b
print(b) # 报错

【2】Enclosed(嵌套)

fun2嵌套在fun1的内部,因此fun2的作用域就是fun1本身

def fun1():
    b = 2
    print("这是fun1打印的:", b)

    def fun2():
        # 这里的b就是fun1的b
        print("这是fun2打印的:", b)
   
    return fun2 # 返回fun2

temp = fun1()
temp() # 此时temp()直接执行fun2中的代码

【3】Global(全局)

Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模 块的全局变量就是一个模块对象的属性,仅限于单个模块文件中

作用范围:当前模块(文件)

a = 2

def fun1():
    print( a)


fun1()	# 2
print(a) # 2

【4】Built-in(内置)

Built-in(内置):解释器内置的变量,比如int, str等

LEGB规则

LGEB规则:按照L—>E—>G—>B的顺序查找变量。

  • 也就是,当不同命名空间具有相同变量名称的变量时,我们首先查找局部变量,如果没有查到,再向全局变量查找。
  • 全局->局部->嵌套->全局->内置

变量的修改

【1】global修改全局变量

def fun1():
    global a   # 声明a为全局变量
    a = 10     # 修改全局变量的值

fun1()       # 调用函数进行修改

print(a)      # 输出全局变量a的值为10

【2】nonlocal修改外层函数变量

在函数中嵌套函数时,嵌套在里面的函数创建的作用域内一般也是不允许改变外层函数变量的值的

除非是nonlocal关键字声明:

def fun1():
    x = 10   # 外部函数中的变量

    def fun2():
        nonlocal x     # 声明 x 为外部函数中的变量
        x = 20        # 修改外部函数的变量

    fun2()  # 调用内部函数进行修改 此时x已成20
    print(x)         # 输出外部函数的变量

fun1() # 20

如果没有nonlocal声明x的话输出的值就是10

文章来源:https://blog.csdn.net/AZURE060606/article/details/134885249
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。