准备知识:
1.在Python解释器开始执行之后,机会在内存中开辟一个空间,每当遇到
一个变量的时候,就把变量和值之间的关系记录下来,但是当遇到函数定义
的时候,解释器只是把函数名读入内存,表示这个函数存在,至于函数内部
的变量和逻辑,解释器是不关心的。也就是说一开始的时候函数只是加载进
来,仅此而已,只有当函数被调用和访问的时候解释器才会根据函数内部声
明的变量来进行开辟变量的内部空间。随着函数执行完毕,这些函数内部变
量占用的空间也会随着函数执行完毕而清空。 例子:
def fun():
a = 10000
print(a)
fun()
print(a) # a不存在了了已经.. 2.命名空间
在一个Python程序的任何一个地方,都存在几个可用的命名空间。
我们存放名字和值的关系的空间起个名字,叫命名空间。
我们的变量在存储的时候就存在这片空间的。
(1)分类:
1)每个函数都有自己的命名空间,叫做局部命名空间,
它记录了函数的变量,包括函数的参数和局部定义的变量。
2)每个模块都拥有自己的命名空间,叫做全局命名空间,
它记录了模块的变量,包括函数、类、其他导入的模块、
模块级的变量和常量。
3)还有就是内置命名空间,任何模块均可访问,它存放着
内置的函数和异常。 加载顺序:内置命名空间,全局命名空间,局部命名空间(函数被执行) 取值顺序:局部命名空间,全局命名空间,内置命名空间 注意:嵌套函数的情况
1.先在当前(嵌套的或lambda)函数的命名空间搜索
2.然后是在父函数的命名空间中搜索
3.接着是模块命名空间中搜索
4.左后在内置命名空间中搜索
(2)生命周期:
命名空间的生命周期不同的命名空间在不同的时刻创建,
有不同的生存期。
1、内置命名空间在 Python 解释器启动时创建,
会一直保留,不被删除。
2、模块的全局命名空间在模块定义被读入时创建,
通常模块命名空间也会一直保存到解释器退出。
3、当函数被调用时创建一个局部命名空间,当函
数返回结果或抛出异常时,被删除。每一个递归
调用的函数都拥有自己的命名空间。 3.作用域
L :local,局部作用域,即函数定义的变量
E :enclosing,嵌套的父级函数的局部作用域,
即包含此函数的上级函数的局部作用域但不是全局
G :global, 全局变量,就是模块级别定义的变量。
B :built-in,系统固定模块里面的变量。比如int等。
搜索变量的优先级顺序:LEGB 1.globals() 和 locals() globals() 获取到全局作用域(内置,全局)中的所有名字
locals() 查看当前作用域中的所有名字
例子:
a = 10
def func():
a = 20
print(a) # 就近原则
print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字
print(locals()) # locals() 查看当前作用域中的所有名字
func()
打印内容:
(1)#20
(2)#{'__name__': '__main__', '__doc__': None, '__package__': None,
# '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x10cee7400>,
# '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
#'__file__': '/Users/busensei/wzy/test.py', '__cached__': None, 'a': 10,
#'func': <function func at 0x10ce6eea0>}
(3)#{'a': 20} 2. global 和 nonlocal
    global:寻找全局作用域中的内容(声明在局部作用域里使用全局作用域的变量)
    nolocal :声明在局部作用域里,使用上层局部作用域的变量, 且上层不可以是全局变量 通过例子来加深理解:
<1>
a = 10
def func():
global a # a 不再是局部变量. 是全局变量
a = 30 # 把全局中的a重新赋值成30
print(a) #30
func()
print(a) #30 <2>
a = 10
def func1():
a = 40
def func2():
nonlocal a # 找局部作用域中 离他最近的那个变量引入进来
a = 20
print(a)#20 这时被引入的变量a的值从40变成了20
func2()
print(a)#20 这时这层的a已经被20所覆盖
func1()
print(a)#10 nonlocal是在他外层找到值停止,如果没有到全局就回报错,不会到全局 结果:
20
20
10 <3>
a = 10
def fun1():
a = 20
def fun3():
def fun2():
nonlocal a
a = a + a
print(a)#40
fun2()
fun3()
print(a)#40
fun1()
print(a)#10 结果:
40
40
10 <4>
a = 10
def fun1():
def fun3():
b = 30
def fun2():
global a
nonlocal b
a = a + b
print(a)#40
fun2()
fun3()
print(a)#40
fun1()
print(a)#40 结果:
40
40
40 <练习>
a = 1
def fun_1():
a = 2
def fun_2():
nonlocal a
a = 3
def fun_3():
a = 4
print(a)
print(a)
fun_3()
print(a)
print(a)
fun_2()
print(a)
print(a)
fun_1()
print(a) 结果:
1
2
3
4
3
3
1

Python命名空间和作用域的更多相关文章

  1. python命名空间与作用域

    python命名空间与作用域   命名空间是名称与对象之间的关系,可以将命名空间看做是字典,其中的键是名称,值是对象. 命名空间不共享名称. 在命名空间中的名称能将任何python对象作为值,在不同的 ...

  2. 详解python命名空间和作用域

    1.典型案例 先从几个典型的案例来看下名称空间及作用域对python代码运行的影响,请看下面几个代码实例及其执行结果,是否符合你的预期. 代码1:块作用域 if True: i = 1 print i ...

  3. python命名空间、作用域、闭包与传值传引用

    (以下内容,均基于python3) 最近在看python函数部分,讲到了python的作用域问题,然后又讲了Python的闭包问题. 在做作业的时候,我遇到了几个问题,下面先来看作业. 一. 作业1: ...

  4. python—命名空间、作用域查找顺序、闭包

    名称空间 name space,如下图: x = 1, 1存放在内存中,1 会有一个内存地址,x 则 存放在 name space 里,并同时记录了 1的内存地址, 即 名称空间是存放了变量x与1绑定 ...

  5. python 命名空间和作用域

    这是python的难点和特点, 有很多的和c/cpp不一样的地方.  它的灵活易用性造成不习惯之处. refer to: http://blog.csdn.net/cc7756789w/article ...

  6. Python进阶 - 命名空间与作用域

    Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...

  7. [Python] 命名空间&作用域

    Python的类语句不会创建实例 类会创建命名空间,通过对象访问类的属性和方法 类不会创建作用域,对方法和属性的引用必须加以限定(如在方法中必须通过self引用实例的属性) class My1(): ...

  8. Python基础-作用域和命名空间(Scope and Namespace)

    在Python中,对象是独立的,不同作用域中的不同名字都可以被绑定在同一个对象上,当然对这个对象的修改会影响所有的引用.赋值操作就是名字和对象的绑定或重绑定.这和C++中的引用是一样的. 1,基础概念 ...

  9. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

随机推荐

  1. 线上cpu100%问题快速定位

    问题描述:服务器上部署了多个tomcat,即垂直切分的Web站点,记忆多个Java微服务,突然收到运维的cpu异常告警. 步骤一:找到最耗cpu的进程 工具:top 方法: 执行top -c,显示进程 ...

  2. html5+CSS3实现的炫酷超链接特效

    今天为大家介绍一个非常炫酷的超链接特效.在你做一些前端的网页时可以在里面去用上这些前卫时尚的效果. 这些超链接特性,大都是借助伪元素.svg.HTML5动画来实现的.效果都很漂亮,不信看下面. 用你的 ...

  3. BZOJ 1680 [Usaco2005 Mar]Yogurt factory:贪心【只用考虑上一个】

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1680 题意: 在接下来的n周内,第i周生产一吨酸奶的成本为c[i],订单为y[i]吨酸奶. ...

  4. BZOJ(begin) 1328 [Usaco2003 Open]Jumping Cows:贪心【波峰波谷模型】

    题目链接:http://begin.lydsy.com/JudgeOnline/problem.php?id=1328 题意: 给你一个长度为n的正整数序列. 可以选任意个数字,只能从左往右选. 偶数 ...

  5. Java丨springMVC + Ajax 来进行分页

    javaweb 分页技术 实现的方式有很多种,但是小编在网上问了度娘也问了谷老师,得到的答案让小编我不是很满意,so,还是自己写吧! 在小编的博文中,小编不会上传源码,只会把重要的代码和思路供大家参考 ...

  6. java面试题07

    1.重载和重写的区别? 重载(Overload):(1)方法重载是让类以统一的方式处理不同类型数据的一种手段.多个同名函数同时存在,具有不同的参数个数/类型.重载Overloading是一个类中多态性 ...

  7. python输入空格间隔的一行int

    str = input() list = [int(x) for x in str.split()] print(list) 用py刷题肯定得遇到空格间隔的键入,先str接收键入的一行字串,然后把st ...

  8. 贪心+等价转化 HDU 1489

    等价转换,题意简单来讲如下:在一条直线均匀分布N个村庄,每个村庄要么买酒,要么卖酒,且村庄的买酒和卖酒供需平衡,总和为0,把k个单位的酒从一个村庄运到相邻的村庄需要k个单位的劳动力,输出最小的劳动力. ...

  9. ngd 查看ng2应用的组件树、路由树

    1.全局安装ngd npm install -g @compodoc/ngd-cli 2.在tsconfig的同级目录下使用ngd命令 ngd

  10. 阿里云 centos7.2 云安装mysql

    [root@iZ28gvqe4biZ ~]# rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm获取h ...