Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链
命名空间
-------‘’存放名字与值的关系”的空间
代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间;
在函数的运行中开辟的临时的空间叫做局部命名空间。


命名空间一共分为三种:
全局命名空间
局部命名空间
内置命名空间
*内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法。
三种命名空间之间的加载与取值顺序:
加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)
取值顺序:
在局部调用:局部命名空间->全局命名空间->内置命名空间
在全局调用:全局命名空间->内置命名空间
综上所述,在找寻变量时,从小范围,一层一层到大范围去找寻。
全局 name='oldzhang'
def func():
print(name)
func() #oldzhang
局部 name='oldzhang'
def func():
name='oldwang'
print(name)
func() #oldwang
内置 def len(x):
return x
print(len([1,2,3])) #[1, 2, 3]
作用域
作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效
局部作用域:局部名称空间,只能在局部范围内生效
#先从局部作用域找,然后再从全局作用域找
#print(globals())
#print(locals()) def func():
a = 12
b = 20
print(locals())
print(globals()) func() '''
{'b': 20, 'a': 12}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000212A588>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'E:/python10/day10/test1.py', '__cached__': None, 'func': <function func at 0x0000000001D03E18>}
'''
global关键字,nonlocal关键字
global:
1,声明一个全局变量。
2,在局部作用域想要对全局作用域的全局变量进行修改时,需要用到 global(限于字符串,数字)。 #字符串、数字不可变
def func():
global a
a = 3
func()
print(a) count = 1
def search():
global count
count = 2
search()
print(count)
ps:对可变数据类型(list,dict,set)可以直接引用不用通过global。
li = [1,2,3]
dic = {'a':'b'} def change():
li.append('a')
dic['q'] = 'g'
print(dic)
print(li)
change()
print(li)
print(dic)
nonlocal: #python3之后才有,之前没有
1,不能修改全局变量。
2,在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。
def add_b():
b = 42
def do_global():
b = 10
print(b)
def dd_nonlocal():
nonlocal b
b = b + 20
print(b)
dd_nonlocal()
print(b)
do_global()
print(b)
add_b()
函数的嵌套和作用域链
函数的嵌套调用
局部函数找全局函数能够找到并且执行。
全局不能找到局部函数内的嵌套函数。如果要执行嵌套函数需要对齐嵌套的函数写下函数才能顺利执行。
def max2(x,y):
m = x if x>y else y
return m def max4(a,b,c,d):
res1 = max2(a,b)
res2 = max2(res1,c)
res3 = max2(res2,d)
return res3 # max4(23,-7,31,11) 函数的嵌套调用
函数的嵌套定义
def f1():
print("in f1")
def f2():
print("in f2") f2()
f1()
###########
def f1():
def f2():
def f3():
print("in f3")
print("in f2")
f3()
print("in f1")
f2() f1()
函数的作用域链:小范围作用域可以使用大范围的变量,但是反之不行,他是单向的。
def f1():
a = 1
def f2():
def f3():
print(a)
f3()
f2() f1()
################
def f1():
a = 1
def f2():
a = 2
f2()
print('a in f1 : ',a) f1()
Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链的更多相关文章
- 【学习笔记】--- 老男孩学Python,day10, 函数, 动态参数 命名空间\作用域  global nonlocal
		
1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序:位置---*args---默认值---**kwargs 在形参上*聚合, **聚合 在实参上*打散, ...
 - 函数的名称空间,函数的嵌套(global, nonlocal),函数名的运用
		
一 函数的名称空间 内置空间:存放python解释器内置函数的空间 全局空间:py文件运行时开辟的,存放的是执行的py文件(出去函数内部)的所有的变量与值的对用关系,整个py文件结束后才会消失. 局部 ...
 - python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包
		
python函数 函数定义 def welcome(): print('hello world!!') welcome() #函数调用 ...运行结果 hello world!! 函数定义和编写原则: ...
 - 动态参数(*args,**kwargs),命名空间和作用域,global和nonlocal,函数的嵌套
		
1. 动态参数 位置参数的动态参数: *args 关键字参数的动态参数 : **kwargs 顺序: 位置,*args,默认值,**kwargs 在形参上*聚合, **聚合 在实参上*打散, **打散 ...
 - 07.python函数作用域global、nonlocal、LEGB
		
函数作用域 作用域 一个标识符的课件范围,这就是标识符的作用域,一般常说的是变量的作用域 def foo(): x = 100 print(x) # 可以访问到吗 上例中x不可以访问到,会抛出异 ...
 - python day- 10    动态参数     函数的嵌套    命名空间和作用域    global和nolocal
		
一.动态参数: 动态参数是形参的一类 分为:动态位置参数(* + 函数名)表示 调用后返回的是元祖 动态关键字参数(** + 函数名)表示 形参的排列顺序: 位置参数 > 动态位置参 ...
 - Python学习日记day10------函数的命名空间、作用域与闭合函数
		
1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...
 - Python:函数的命名空间、作用域与闭合函数
		
1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...
 - python基础(7)-函数&命名空间&作用域&闭包
		
函数 动态参数 *args def sum(*args): ''' 任何参数都会被args以元组的方式接收 ''' print(type(args)) # result:<class 'tupl ...
 
随机推荐
- 解决Jupyter notebook[import tensorflow as tf]报错
			
参考: https://blog.csdn.net/caicai_zju/article/details/70245099
 - 老男孩python学习自修第二十一天【socket】
			
1. 使用python编写一个静态的web服务器,能够处理静态页面的http请求 原理: a. 使用socket进行服务端和浏览器之间的通信 b. 使用多线程处理多个客户端浏览器的请求 c. 解析用户 ...
 - PHP涉及到的英文单调
			
slashes [slæʃeis]:斜线 uppercase ['ʌpəˌkeɪs]:大写字母,简写uc strip [strɪp]:去掉 trim [trɪm]:整理(修剪) explode [ɪk ...
 - Lodop打印控件设置表格次页偏移
			
Lodop打印控件有很好的自动分页功能,超文本table表格一页装不下,自动分到第二页,第三页……通常表格之前还会有一些内容,比如标题,制表人名称日期什么的杂七杂八的东西,这种东西会占用一定的空间,这 ...
 - LODOOP中的各种边距 打印项、整体偏移、可打区域、内部边距
			
Lodop中的打印项内容位置定位,除了打印项本身的top,left值,也会受其他设定或打印机的影响.打印开发,先用虚拟打印机测试出正确结果,然后客户端用打印维护微调常见问题:1.设置打印项相对于纸张居 ...
 - MySQL 优化小技巧
			
碎片整理: mysql数据一开始是在磁盘上顺序存放的,如果数据表有频繁的update改动,那么数据就会形成很多碎片,拖慢速度和不利于索引: 优化碎片有两种方式: alter table user en ...
 - 吴恩达deeplearning之CNN—卷积神经网络
			
https://blog.csdn.net/ice_actor/article/details/78648780 个人理解: 卷积计算的过程其实是将原始的全连接换成了卷积全连接,每个kernel为对应 ...
 - Upload Files In ASP.NET Core 1.0 (Form POST And JQuery Ajax)
			
Uploading files is a common requirement in web applications. In ASP.NET Core 1.0 uploading files and ...
 - codeforces616B
			
Dinner with Emma CodeForces - 616B Jack decides to invite Emma out for a dinner. Jack is a modest st ...
 - bzoj-1191(二分图最大匹配)
			
解题思路:比较裸的一道题,直接跑匈牙利就行了,但是要注意一点,这个兔崽子是在闯关,一道题回答不出来就没了,直接在题目循环那里加一个else break;就行了!!!; #include<iost ...