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 中名称空间分三种: 内置名称空间 全局名称空间 局部名称空间 内置名称空间: 原码里面的一些函数都是存在这个内存空间中,任何模块均可访问它,它存放着内 ...
随机推荐
- Nginx日志通过Flume导入到HDFS中
关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) flume上传到hdfs: 当我们的数据量比较大时,比如每天的日志文件达到5G以上 使用ha ...
- vue3.0+vite+ts项目搭建--vite.config.ts配置(三)
vite.config.ts配置 配置路径处理模块 安装ts的类型声明文件 yarn add @types/node -D 通过配置alias来定义路径的别名 resolve: { alias: { ...
- 老旧业务重构案例——IM系统如何设计
一年半之前刚来到这个团队,便遭遇了一次挑战: 当时有个CRM系统,老是出问题,之前大的优化进行了4次小的优化进行了10多次,要么BUG重复出现,要么性能十分拉胯,总之体验是否糟糕!技术团队因此受到了诸 ...
- 论文翻译:2020_Nonlinear Residual Echo Suppression using a Recurrent Neural Network
论文地址:https://indico2.conference4me.psnc.pl/event/35/contributions/3367/attachments/779/817/Thu-1-10- ...
- 梯度下降法实现(Python语言描述)
原文地址:传送门 import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.style.use(['ggplo ...
- JS定时器不可靠的原因及解决方案
前言 在工作中应用定时器的场景非常多,但你会发现有时候定时器好像并没有按照我们的预期去执行,比如我们常遇到的setTimeout(()=>{},0)它有时候并不是按我们预期的立马就执行.想要知道 ...
- Linux防止文件被误删除或修改
chattr简介 Linux没有回收站,一旦文件或文件夹被误删除,要寻找回来很麻烦,不如事先对一些重要的文件做一些保护,这时我们需要一个命令chattr,其使用格式为 chattr 操作符 属性 文件 ...
- 《剑指offer》面试题59 - II. 队列的最大值
问题描述 请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value.push_back 和 pop_front 的均摊时间复杂度都是O(1). 若队列为空,pop_ ...
- 使用idea时jsp中使用out.print();时报错的解决办法
在用Maven创建web项目时 在jsp页面中out.print();老是报错 这边print显示红色出错因为这边使用的是JSP的API并不是Servlet的,但是可以运行,所以我们只要导包就完事其实 ...
- 在DigitalOcean vps中安装vnstat监控流量,浏览器打开php代码。。。
由于DigitalOcean中没有发现可以观察已用流量的功能,有想知道自己的流量使用情况,所以安装了vnstat. 安装过程十分简单,见百度经验,官方主页等. 1.安装完vnstat后,直接命令vns ...