Python3-命名空间和作用域介绍

Python3-命名空间和作用域介绍

1. 命名空间

命名空间(Namespace)从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。

类比:同一个文件夹下不能有同名文件,但是不同文件夹下可以有同名文件。一个文件夹就相当于是一个命名空间。

命名空间的类型:

  • 内置名称(built-in names): Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
  • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
  • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)

Python 变量的查找顺序为:局部的命名空间去 -> 全局命名空间 -> 内置命名空间。
如果找不到变量,它将放弃查找并引发一个 NameError 异常。

命名空间的生命周期: 命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束。

# 命名空间实例:
# var1 是全局名称
var1 = 5
def some_func():
 
    # var2 是局部名称
    var2 = 6
    def some_inner_func():
 
        # var3 是内嵌函数的局部名称
        var3 = 7

2. 作用域

作用域就是一个 Python 程序可以直接访问命名空间的正文区域。

在一个 python 程序中,直接访问一个变量,会从内到外依次访问所有的作用域直到找到,否则会报未定义的错误。

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

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称

作用域的类型:

  • L(Local):局部作用域。如果含有内嵌函数,则为内嵌函数中的局部作用域。
  • E(Enclosing):含有内嵌函数,在外函数内,内函数外的作用域。
  • G(Global):全局作用域
  • B(Built-in):内置作用域

作用域规则顺序LEGB
在这里插入图片描述

Python 中只有模块(module)类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的。

全局变量和局部变量:

①定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

②局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

通过以下实例可以看到,局部变量是不能被外部访问的。

total = 0  # 全局变量

# 可写函数说明
def sum(arg1, arg2):
    # 返回2个参数的和."
    total = arg1 + arg2  # total在这里是局部变量.
    print("函数内是局部变量 : ", total)
    return total

# 调用sum函数
print('局部变量')
sum(10, 20)
print('====================================')
print('全局变量')
print("函数外是全局变量 : ", total)

global 和 nonlocal关键字:
global 局部变量:修改局部变量为全局变量
nonlocal 局部变量:若包含内嵌函数,则修改内嵌函数的局部变量处于外函数内、内函数外的局部变量

总结:关于命名空间和作用域的理解,可以将其看作是变量的有效范围,在使用变量时,若调用的是非有效范围内的变量,就会报错。

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/110365425