python名称空间介绍
python名称空间介绍
名称空间
python 中名称空间分三种:
内置名称空间
全局名称空间
局部名称空间
内置名称空间:
原码里面的一些函数都是存在这个内存空间中,任何模块均可访问它,它存放着内置的函数和异常
全局名称空间:
当程序运行时,代码从上之下一次执行,他会将变量与值的关系存储在一个空间中,这个空间叫做全局名称空间(名称空间,命名空间)。
名称空间里面存的东西是,变量名与变量的内存地址的对应关系。
————(存的内容如:neame --> 13265654 一个对应关系)
当程序遇到函数时,他会将函数名存在内存中,函数体莫不关心。
————(也就是说全局名称空间,可以存变量名、变量值、函数名、但不存函数体)
局部名称空间:
函数外面是访问不到临时空间的内容的,随着函数的执行完毕,临时名称空间会释放掉,像这个临时开辟的空间叫局部名称空间(临时名称空间)。
当函数执行时,内存会临时开辟一个空间,存放函数体里面的代码(变量,代码等)
将命名空间分为两种作用域:
全局作用域和局部作用域
全局作用域包括:
内置名称空间。
全局名称空间。
局部作用域包括:
局部名称空间。
内存空间的加载顺序:
内置名称空间(列如打开PyCharm就会加载) ---> 全局名称空间(当程序开始执行时的时候加载) ---> 局部名称空间(当函数调用时开始加载)
函数的取值顺序:单向不可逆
局部名称空间(当函数调用时取值) -->全局名称空间(当程序执行时) -->内置名称空间
先从局部内存空间里取值,再次找全局名称空间里找,最后再找内置名称空间
注:取值顺序是单向不可逆的。(从小到大,不可逆的查找顺序)
函数中,取值顺序按局部,全局最后到内置,查找但只是引用,不能修改。
修改报错举例:
count = 0
def func1()
count = count + 1
print(count)
func1()
此例在函数引用count时更改了count会报错。局部引用没法修改全局和内置的变量值。
函数的嵌套:(记住两个关键点)
代码顺序执行,当见到函数名加括号,就是执行函数。
函数在没有执行完是不会执行下面的内容的。
注:
执行一个函数就会开辟一个临时空间进行存储,即每个函数都会单独开辟一个临时空间使用存放函数体内容。
举例:
# def func1():
# print(666)
#
# def func2():
# func1()
# print(333)
#
# def func3():
# func2()
# print(222)
# print(111)
# func3()
# print(555)
# def func1():
# name = 'susi'
# print(name)
# def func2():
# name1 = 'git'
# print(333)
# print(444)
# func2()
# func1()
取出名称空间内容方法:调用内置函数globals()、locals()
内置函数globals() 全局名称空间内容,字典格式输出
反回一个字典,字典里面的内容是全局名称空间的内容
不论该函数在什么内存空间中,反回的值一直是全局名称空间的所有内容
内置函数locals() 当前作用域空间内容,字典格式输出
反回一个字典,当前位置的所有变量
可以理解为,所在内存空间中的的所有变量,全局内存即显示所有,局部内存显示当前局部内存里的所有变量,在哪个局部内存里就显示哪个内存里的所有变量。,
举例:
name = 'alex'
age = 1000
sex = '男'
def func1():
name1 = 'oldboy'
age = 10000
print(globals())
print(locals())
func1()
改变上层空间的变量值方法
不可变数据类型修改上层空间变量值的方法:调用内置函数global、nolocal
global作用:(操作全局变量)
1. 应用并改变一个全局变量。
2. 在局部作用域声明一个全局变量。
前提:
在函数取值顺序时有一条,局部空间向全局空间可以引用取值,不能改变取值,否则会报错!
举例1:应用并改变一个全局变量。
count = 1
def func1():
global count ###引用并改变一个全局变量不会报错
count = count + 1
count = count + 100
print(count)
func1()
print(count)
结果:
102
102
举例2:在局部作用域声明一个全局变量。
def func1():
global name ###局部作用域直接声明一个全局变量
name = 'susi'
print(name) ###打印局部变量name 结果:susi
func1()
print(name) ###打印全局变量name 结果:susi
nonlocal作用:(操作局部变量)
Nonlocal不能操作全局变量,只针对局部变量进行修改。
在函数嵌套中,函数从内向外依次取值,向上层函数取值时,都只是引用不能改变。想要改变需要借助nolocal进行修改。
Nonlocal在函数嵌套,多层局部变量,从那层引用的该变量,就从那层开始全部改变。
举例:
def func1():
count = 1
def inner():
nonlocal count
count = count + 3
print(count) ###打印inner函数作用域的count值
def inner2():
pass
inner()
print(count) ###打印inner上级函数func1作用域的count值
func1()
结果:
4
4
可变的数据类型 list dict set修改上层空间变量值的方法:(不用global nonlocal)
举例:
# list = []
# def func1():
# list.append(666)
# func1()
# print(list)
如果默认参数是一个可变的数据类型,那么他在内存中永远是一个内存地址,一个变都变。
举例:
def extendList(val,list=[]):
list.append(val)
return list ###结束函数反回值是list
list1 = extendList(10)
print('list1=%s'%list1) 结果:list1=[10]
list2 = extendList(123,[])
print('list2=%s'%list2) 结果:list2=[123]
list3 = extendList('a')
print('list3=%s'%list3) 结果:list3=[10, 'a']
print('list1=%s'%list1) 结果:list1=[10, 'a']
print('list2=%s'%list2) 结果:list2=[123]
print('list3=%s'%list3) 结果:list3=[10, 'a']
给函数传参立马得出结果和传完参数统一打印结果,可以看出可变的数据类型,在内存地址是不会改变的。
python名称空间介绍的更多相关文章
- python名称空间和作用域
python名称空间和作用域 名称空间 名称空间:例如a=1000,python解释器会开辟一块新的内存来存贮1000这个变量值,然后会有一个a指向这个1000,那么a存在哪里?其实他和变量值差不多, ...
- Python名称空间与作用域
什么是名称空间? 比如下图的长方形代表内存,在这个内存里我要设置一个变量100,那么这个变量得有个门牌号,就叫他a吧,但其实变量不是这么存储的,他其实的存储方式是这样的,他会有一个名称空间,这个名称空 ...
- Python 名称空间与作用域、闭包与装饰器
Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...
- 从入门到自闭之Python名称空间
名称空间: 内置空间:python解释器自带的一块空间 全局空间:py文件中顶格写的就是全局空间 局部空间:函数体中就是局部空间 加载顺序: 内置空间 全局空间 局部空间 # def func(): ...
- day11 python名称空间 作用域
day11 python 一.三元运算符 def func(a, b): return a if a > b else b print(func(44,66)) 二:函数 ...
- Python 名称空间和作用域
a = 10 # lst = [1,2,3,4] # # # 内置函数 print("你好啊,我叫赛利亚") # def chi(): a = 10 b = 20 # # # # ...
- Python名称空间和闭包
一.名称空间 1.定义:又名 name space,顾名思义,就是存放名字的地方.比如:若变量x = 1,1存放在内存中, 而名称空间正是存放名字x与1绑定关系的地方. 2.分类: locals : ...
- Spring p名称空间配置属性
1.p 名称空间介绍 从 2.0开始,Spring支持使用名称空间的可扩展配置格式.这些名称空间都是基于一种XML Schema定义.事实上,我们所看到的所有bean的配置格式都是基于一个 XML S ...
- Python基础之函数:1、函数的介绍及名称空间
目录 一.函数 1.什么是函数 2.函数的语法结构 3.函数的定义与调用 4.函数的分类 5.函数的返回值 6.函数的参数 二.函数参数 1.位置参数 2.默认参数 3.可变长参数 1.一个*号 2. ...
随机推荐
- 基础架构之Docker私有库
由于项目要容器化,所有搭建自己的镜像库也是很有必要的,不然发到直接使用官方的镜像库,速度绝对能让你头疼,这篇文章就介绍搭建自己的镜像私有库. (一) 环境要求 Centos 7.5.1804 Doc ...
- idea整个项目乱码解决办法
idea前几天还好好的,这两天一直出现乱码.不止一个文件,是整个项目都有这个问题.想想这几天什么也没做啊... 上网搜了下 解决. 经过多次排查寻找,终于,在项目的目录下有个.idea的文件夹,这个文 ...
- Android学习——BroadCast(一)
初识广播 BroadCast即为广播,为安卓四大组件之一,用于在应用程序和Activity间传输信息.一条广播,分为发送和接收两部分,发送方通过Intent存储信息,并进行发送.接收方通过BroadC ...
- LESS嵌套中的Mixins和classes
less的嵌套规则对于有效组织你的css代码有较好的作用.其中使用mixin或者class都可以作为被嵌套的实体,但是二者还是有区别的: mixin必须由.name+(){}的pattern来定义,而 ...
- Linux ->> UBuntu 14.04 LTE下安装Hadoop 1.2.1(伪分布模式)
Hadoop的运行模式可分为单机模式.伪分布模式和分布模式. 首先无论哪种模式都需要安装JDK的,这一步之前的随笔Ubuntu 14.04 LTE下安装JDK 1.8中已经做了.这里就不多说了. 其次 ...
- QA-IDEA中用maven配置项目无法加载JDBC
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver Im building Maven Java Web application and w ...
- npm install 安装项目依赖,报错ERR! Unexpected end of JSON input while parsing near的方法汇总
问题描述: npm install 安装项目依赖的时候,有时会出现: ERR! Unexpected end of JSON input while parsing near 错误 原因: npm 的 ...
- Struts2学习-自动
和ssh框架的基本一致. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...
- Prototype Pattern
- Java实现的有道云笔记图片批量下载工具
有朋友问我每天哪里找时间写这么多文章. 作为一个程序员,当然要善于利用各种工具提高自己做事情的效率了.如果没有现成的工具,就得自己造. 我写文章一般是在云笔记里编辑,完成之后直接复制粘贴到自媒体平台. ...