Python基础—名称空间(Day10)
一、名称空间和作用域
1.全局名称空间(名称空间、命名空间):
py文件运行时代码从上之下依次执行,看到一个变量就会将这个变量与对应值的内存地址的关系存到名称空间里,代码要运行时(print时)从名称空间里找变量与对应值的内存地址,通过内存地址找到对应的值。
2.局部名称空间(临时名称空间):
函数名放在内存地址里,当执行函数时,会在内存中开辟一个临时名称空间 ,存放函数体内的所有变量与值的关系。随着函数的执行完毕,临时空间自动关闭。
3.内置名称空间:所有的内置函数等存储的空间。
加载顺序:内置名称空间---->全局名称空间---->(函数执行时)局部名称空间
取值顺序:(函数执行时)局部名称空间--->全局名称空间---->内置名称空间
4.全局作用域:包含全局名称空间,内置名称空间,在整个文件的任意位置都能被引用,全局有效。
局部作用域:局部名称空间,只在局部范围内有效。
5.内置函数
globals:将全局名称空间的所有变量放在一个字典里。
lacals:将局部名称空间里的变量放在一个字典里。
6.关键字
global作用:
1)在局部名称空间内声明一个全局变量。
- def func1():
- global name
- name='老男孩'
- print(name)
- func1()
- print(name)
- 执行结果:
- 老男孩
- 老男孩
2)在局部名称空间内改变一个全局变量。
- name='wusir'
- def func1():
- global name
- name='老男孩'
- print(name)
- func1()
- print(name)
- 执行结果:
- 老男孩
- 老男孩
nonlocal(python2中没有):
1.不能修改全局作用域。
- a=4
- def func1():
- nonlocal a
- a=5
- print(a)
- func1()
- print(a)
- 报错#a是全局
2.在局部作用域中,对父级作用域(后者更外层的作用域非全局作用域)的变量进行引用和修改,并且引用的哪层从哪层及以下的变量全部发生改变。
- a=4
- def func1():
- b=6
- def func2():
- nonlocal b #从这层起对b进行修改
- b=666
- print(b)
- func2()
- print(b)
- func1()
- 执行结果:
- 666
- 666
二、函数的嵌套
函数调用时执行
代码从上至下依次执行,调用函数时函数里面从上之下依次执行
- def f1():
- print('in f1')
- def f2():
- print('in f2')
- f2()
- f1()
- 执行结果:
- in f1
- in f2
- def f1(): #print('in f3')
- def f2(): #print('in f1')
- def f3(): #print('in f2')
- print('in f3')
- print('in f2')
- f3()
- print('in f1')
- f2()
- f1()
- 执行结果:
- in f1
- in f2
- in f3
三、函数名的本质
函数名是函数的名字,本质是变量(特殊的变量),函数名()表示执行此函数。
1.单独打印函数名返回函数的地址。
- def func1():
- print(666)
- print(func1)
- 执行结果:
- <function func1 at 0x000000D735492400>
2.函数名的赋值。
- def func2():
- print(666)
- f=func2
- print(f())
- 执行结果:
- 666
- None
3.函数名可以作为容器类数据的元素。
- def f1():
- print(11)
- def f2():
- print(22)
- def f3():
- print(33)
- l1=[f1,f2,f3]
- for i in l1:
- i()
- l1=[]
- for i in range(1,4):
- l1.append('f'+str(i))
- print(l1)
- for i in l1:
- eval(i)()
4.函数名可以作为参数。
- a=1
- def f1(x):
- print(x)
- f1(a)
- 执行结果:
- 1
5.函数名可以作为函数的返回值。
- def f11(x):
- return x
- ret=f11(5)
- print(ret)
- 执行结果:
- 5
四、闭包
闭包就是内层函数对外层函数(非全局)变量的引用。
- def wraaper1():
- name='guo'
- def inner():
- print(name)
- inner()
- print(inner.__closure__)
- wraaper1()
- 执行结果:
- guo
- (<cell at 0x00000073DFFA7228: str object at 0x00000073DFF8CDF8>,)
当函数开始执行时,如果遇到了闭包,它有一个机制,它会永远开辟一个内存空间,将闭包中的变量等值放在其中,不会随着函数的执行完毕而消失。
- name='老男孩'
- def wraaper2(n):
- def inner():
- print(n)
- inner()
- print(inner.__closure__)
- wraaper2(name)
- 执行结果:
- 老男孩
- (<cell at 0x0000007DC1777228: str object at 0x0000007DC1773260>,)
Python基础—名称空间(Day10)的更多相关文章
- python函数名称空间
一.命名空间概念 命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方.命名空间分三种: locals:函数内的名称空间,包括局部变量和形参 gl ...
- Python 的名称空间和作用域
最开始对名称空间的了解是在学习函数的时候,那时候知道了作用域的查找顺序,以及全局名称空间和局部名称空间,产生疑惑的时候为学递归的时候,那时候还没有名称空间这个概念,只知道递归有个最大深度,那时候以后递 ...
- python之名称空间
1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类的数据属性是共享给所有对象 print(id(g1.c ...
- Python(名称空间、函数嵌套、函数对象)
一.名称空间: 名称空间 定义:存放名字和值的绑定关系 内置名称空间 python自带的名字,如print.int.str 解释器启动就会生效 全局名称空间 文件级别定义的名字,都会放 ...
- python函数名称空间与作用域、闭包
一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...
- python函数----名称空间和作用域
一 名称空间 名称空间即存放名字与对象映射/绑定关系的地方. 对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系. 在程序执行 ...
- python之名称空间与函数对象
目录 名称空间 内置名称空间 全局名称空间 局部名称空间 名称的查找顺序 作用域 global关键字 nonlocal关键字 函数名的多种用法 函数的嵌套 名称空间 名称空间就是变量名与变量值绑定关系 ...
- Python 名称空间与作用域、闭包与装饰器
Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier).我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的.说得有点玄乎,我们以例子说明. 例如 ...
- python名称空间介绍
python名称空间介绍 名称空间 python 中名称空间分三种: 内置名称空间 全局名称空间 局部名称空间 内置名称空间: 原码里面的一些函数都是存在这个内存空间中,任何模块均可访问它,它存放着内 ...
随机推荐
- 移动端开发,rem单位妙用,自适应
其实我们都会,但是不会用 大家看到的都是,这样的,这样的. http://www.woshipm.com/ucd/24110.html http://www.w3cplus.com/css3/defi ...
- 【刷题-LeetCode】289. Game of Life
Game of Life According to the Wikipedia's article: "The Game of Life, also known simply as Life ...
- 【记录一个问题】神坑,自定义一个golang的error类型,居然运行崩溃了
2020-05-20 18:20补充: 感谢yif同学提供指导,出现错误并且打印大量信息的原因是函数递归调用导致栈溢出. 而导致递归调用的关键代码是%v 类型实现了error的interface %v ...
- unity3d inputfield标签控制台打印object
inputfield标签控制台打印object 这说明没有字符串给入 这是因为 inputfield下的text不能人为写入值,只能在game界面输入. 所以这个标签里的text做个默认值不好搞.
- vue3源码node的问题
下载vue3源码后,下载依赖时,node的版本需要在10.0.0以上,并且不同的vue3里面的插件的配置对版本依赖还不同,14.0.0以上的版本基本都不支持win7了, win7系统可以安装12.0. ...
- gin中绑定查询字符串或表单数据
package main import ( "github.com/gin-gonic/gin" "log" "time" ) type P ...
- gin中映射查询字符串或表单参数
package main import ( "fmt" "github.com/gin-gonic/gin" ) func main() { r := gin. ...
- mysql新增用户无法登陆问题解决ERROR 1045 (28000)
mysql增加新用户无法登陆解决方法 ERROR 1045 (28000): Access denied for user 'appadmin'@'localhost' (using password ...
- springboot 配置springmvc?
package com.aaa.zxf.config; import org.springframework.boot.SpringBootConfiguration; import org.spri ...
- Servlet中的Filter 过滤器的简单使用!
package com.aaa.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servle ...