python 作用域嵌套_06-Python基础之函数进阶(嵌套,作用域)

命名空间与作用域:

命名空间 有三种

内置命名空间 —— python解释器

就是python解释器一启动就可以使用的名字存储在内置命名空间中

内置的名字在启动解释器的时候被加载进内存里

全局命名空间 —— 我们写的代码但不是函数中的代码

是在程序从上到下被执行的过程中依次加载进内存的

放置了我们设置的所有变量名和函数名

局部命名空间 —— 函数

就是函数内部定义的名字

当调用函数的时候 才会产生这个名称空间 随着函数执行的结束 这个命名空间就又消失了

作用域:

在局部:可以使用全局、内置命名空间中的名字

在全局:可以使用内置命名空间中的名字,但是不能用局部中使用

在内置:不能使用局部和全局的名字的

在正常情况下,直接使用内置的名字

当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字

当我自己有的时候 我就不找我的上级要了

如果自己没有 就找上一级要 上一级没有再找上一级 如果内置的名字空间都没有 就报错

多个函数应该拥有多个独立的局部名字空间,不互相共享

func --> 返回函数的内存地址

函数名()   函数的调用

函数的内存地址()   函数的调用

作用域两种

全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域 ——globals(),函数内部需要定义全局作用域需要加global

局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()

a = 1b= 2

deffunc():

x= 'aaa'y= 'bbb'

print(locals()) #{'x': 'aaa', 'y': 'bbb'}

print(globals()) #打印全局

func()print(globals())#打印全局

print(locals()) #外部的本地也是全局,locals 输出什么 根据locals所在的位置

对于不可变数据类型 在局部可是查看全局作用域中的变量,但是不能直接修改

如果想要修改,需要在程序的一开始添加global声明

如果在一个局部(函数)内声明了一个global变量,那么这个变量在局部的所有操作将对全局的变量有效

a = 1 #定义全局变量a

deffunc():

a= 2

print(a + 2) #day4global a #修改函数内的a为全局,如不加global 则a的更改对外部

#全局a不影响,但是内部的操作可以,如内部

#返回sum = a +b 则这个a是内部的值,会有将a改为全局的警告

a = 3func()#调用函数

print(a) #a=3

函数的嵌套与闭包

函数的嵌套:函数内部其他函数

#求三个函数最大值

def the_max(x,y,z): #函数的嵌套调用

c = max(x,y) #调用内置函数max,将x,y之间最大值赋值给c,

return max(c,z) #再次调用max,将c与z的最大值返回给定义函数

a = the_max(5,6,2) #调用函数

print(a)

nonlocal 定义变量

nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量,声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量

对全局无效

对局部 也只是对 最近的 一层 有影响

a = 1

defouter():

a= 1 #并不受影响,只能本地a没有往上

definner():

a= 2

definner2():

nonlocal a#声明了一个上面第一层局部变量

a += 1 #不可变数据类型的修改 ,之后a =2

inner2()print('inner2内 :', a)

inner()print('inner内 :',a)

outer()print('全局 :',a)'''打印结果

inner2内 : 3

inner内 : 1

全局 : 1'''

闭包:嵌套函数,内部函数调用外部函数的变量

defouter():

a= 1

definner():print(a)returninner

inn= outer() #返回一个地址,

print(inn)print(inn())'''打印结果

1

None'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值