第十三弹 python 命名空间 和 作用域

本文详细介绍了Python中的命名空间概念,包括内置、全局和局部命名空间的定义与作用,以及它们的生命周期、查找顺序等关键信息。同时,还深入探讨了`global`和`nonlocal`关键字如何帮助修改不同作用域内的变量。

命名空间

命名空间是映射到对象的名称。使用python字典实现的;是为了避免名称冲突的一种方法。各个命名空间是独立的,没有任何关系,即在一个命名空间中不能有重复的名称,但是在不同命名空间中可以重复,而不会影响其它命名空间;

命名空间分类

总共有三种类别的命名空间:

  • 内置命名空间:主要用于存放内置函数;如: abs();
  • 全局命名空间:主要记录了模块的变量,包括函数、类、其它导入模块、模块级的变量和常量;
  • 局部命名空间:函数中定义的名称;主要记录了函数的变量,包括函数的参数和局部定义的变量;类中也是;

查找顺序

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

生命周期

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

  • 内置命名空间:解释四起启动时创建,退出时销毁
  • 全局命名空间:解释器读取模块定义时创建,一直持续到解释器退出
  • 局部命名空间:调用函数时创建,并在函数返回或抛出异常时被删除 

作用域

决定命名空间可直接访问python程序的文本区域,可直接访问是对名称的非限定引用会在命名空间中进行查找;作用域虽然是静态的,但会动态使用;在python中,只有模块、类、函数才会引入新的作用域;其他代码块,不会引入新的作用域;

作用域分类:

  • 局部作用域(Local):最内层作用域,包含局部变量;如:函数内部定义的一些变量
  • 嵌套作用域(Enclosing):包含非局部名称和非全局名称;如两个嵌套函数;
  • 全局作用域(Global):当前模块的全局名称
  • 内建作用域(BuiltIn):内置名称的命名空间

查找顺序

局部作用域(L) > 嵌套作用域(E) > 全局作用域(G) > 内建作用域(B)

global和nonlocal

python有一个特殊规定;如果不存在global和nonlocal语句,则对变量的赋值总是进入局部作用域中,赋值操作不会复制数据,只是将变量名称绑定到对象。删除也是如此:del x从局部作用域引用的命名空间中移除对于x的绑定。所有引用新名称的操作都是使用局部作用域;尤其import语句和函数定义会在局部作用域中绑定模块或函数名称。

global

应用于代码块,用来在函数或其他局部作用域中将变量应用于全局变量,实现在函数内部或其他局部作用域中改变变量的值;所有对该名称的使用都是在全局命名空间内对该名称的绑定引用;其命名空间包含该代码所在模块的命名空间,以及内置命名空间;全局命名空间先被搜索;如果未找到指定名称,再搜索内置命名空间;

如果在局部作用域中不使用global关键字,则在函数内部修改的变量不会影响到全局变量:

g = 'test'

def do_local():
	g = 'local'
	print('do_local inside: ', g)

do_local()
print('global: ', g)

# do_local inside:  local
# global:  test

global仅如果局部要对全局变量进行修改:

g = 'test'

def outer():
	g = 'nonlocal'
	def do_local():
		global g
		g = 'global'
		print('do_local inside: ', g)
	do_local()
	print('outer: ', g)

outer()
print('global: ', g)

# do_local inside:  global
# outer:  nonlocal
# global:  global

nonlocal

仅用于修改嵌套作用域中的变量

def outer():
	n = 'test'
	def do_local():
		nonlocal n
		n = 'nonlocal'
	do_local()
	print('outer: ', n)

outer()

# outer:  nonlocal

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值