python进阶——装饰器系列之命名空间与作用域

花间影清欢课程 2024-12-01 04:11:37
一、命名空间

命名空间是指从名称到对象的映射。命名空间提供了在项目中避免命名冲突的一种方式,各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名的。

如上图,一个文件夹中可以包含多个子文件夹,但是每个文件夹中不能有相同文件名的文件,但是不同文件夹中的文件是可以重名的。

二、python中的命名空间2.1 命名空间分类

python中有三种命名空间:

内置命名空间(built-in namespace),python语言内置的命名空间,比如函数名abs、char等;全局命名空间(global namespace),如模块中定义的名称,记录了模块变量,包括了函数、类、其它导入的模块、模块级的变量和常量等;局部命令空间(local namespace),函数中定义的命名空间,记录了函数的变量,包括函数的参数和局部定义的变量。2.2 命名空间查找顺序

局部命名空间 ——> 全局命名空间 ——> 内置命名空间

2.3 命名空间的生命周期

命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束了。因此,无法从外部命名空间访问内部命名空间的对象

import os # 内置命名空间num_golbal = 5 # 全局命名空间def outside_func(): num_inner = 6 # 局部命名空间 def inner_func(): num_inner_inner = 7 # 内嵌局部命名空间三、作用域

作用域就是python程序可以直接访问命名空间的属性方法等;在python程序中,直接访问一个变量会从内到外依次访问所有的作用域直到找到,否则会报末定义的错误。

python中,程序的变量并不是在所有位置都可以访问的,访问权限决定了这个变量是在哪里赋值的。

python作用域一共有4种,分别是:

L(Local):最内层,包含局部变量,比如一个函数内部;E(Enclosing)包含了非局部非全局的变量。比如两个嵌套函数,一个函数A里面包含了另一个函数B,那么对于B来说A中的作用域就为nonlocal;G(Global):当前脚本的最外层,比如当前模块的全局变量;B(Built-in):包含了内建的变量/关键字等。

作用域的查找顺序:L ——> E ——> G —> B

关于作用域需要理解下面三点:

在全局作用域不能访问局部定义的变量在局部可以访问全局定义的变量,但是不能直接修改全局定义的变量(可以使用别的方式修改)全局变量能够被文件任何地方引用,但修改只能在全局进行操作;如果局部没有找到所需的变量,就会往外进行查找,没有找到就会报错;四、global与nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlobal关键字了。

4.1 修改全局变量时使用global#! /usr/bin/python3num = 1def func1(): global num # 需要使用global关键字 print(num) num = 123 print(num)func1()print(num)# output# 1# 123# 1234.2 修改嵌套作用域中的变量则需要nonlocal关键字#!/usr/bin/python3def outer(): num = 10 def inner(): nonlocal num # nonlocal关键字声明 num = 100 print(num) inner() print(num)outer()# output# 100# 100
0 阅读:0