Python命名空间和作用域

Python作用域和命名空间

命名空间

命名空间是从名称到对象的映射,大部分的命名空间都是通过Python字典来实现的。
命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何联系,所以一个命名空间中不能有重名,但不同命名空间是可以重名而没有任何影响的。
一般有三种命名空间:
内置名称(built-in names):Python语言内置的名称,比如函数名abs,char和异常名称BaseException等等。
全局名称(global names):模块中定义的名称,记录了模块的变量,包括函数,类,其他导入的模块,模块级的变量和常量。
局部名称(local names):函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。
在这里插入图片描述
命名空间的查找顺讯
局部命名空间->全局命名空间->内置命名空间

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

作用域

Python的作用域一共有4种:
L(Local):最内层,包含局部变量,比如一个函数/方法内部。
E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套的函数,一个函数A里面有包含了一个函数B,那么对于B中的名称来说A中的作用域就为nonlocal
G(global):当前脚本的最外层,比如当前模块的全局变量。
B(Built-in):包含了内建的变量/关键字等。最后被搜索
在局部找不到就会去局部外的局部找,再找不到就会去全局找,再去内置中找。

Python中只有模块,类,以及函数才会引入新的作用域,其他的代码块(如if/elif/else、try/exception、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问。

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都被加入到作用域中。
在这里插入图片描述

global和nonlocal关键字

当内部作用域想修改外部作用域的变量是,就要用到global和nonlobal关键字。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值