函数嵌套
程序员文章站
2022-06-24 11:29:23
函数的嵌套 定义 函数内部定义的函数,无法在函数外部使用内部定义的函数 圆的面积周长 名称空间与作用域 定义 内存中有一块内存存储变量名与变量间绑定关系的空间,称为名称空间 内置名称空间 存放python解释器自带的名字 生命周期:解释器启动时生效,关闭失效 全局名称空间 处内置与局部的名字之外,其 ......
函数的嵌套
定义
函数内部定义的函数,无法在函数外部使用内部定义的函数
def f1(): def f2(): print('from f2') f2() f2()
def f1(): def f2(): print('from f2') f1()
from f2
圆的面积周长
from math import pi def circle(radius,action='area'): def area(): return pi*(radius**2) def perimeter(): return 2*pi*radius if action=='area': return area() else: return perimeter() print(f'circle(10):{circle(10)}') print(f"circle(10,action='perimeter'): {circle(10,action='perimeter')}")
名称空间与作用域
定义
内存中有一块内存存储变量名与变量间绑定关系的空间,称为名称空间
内置名称空间
存放python解释器自带的名字
生命周期:解释器启动时生效,关闭失效
全局名称空间
处内置与局部的名字之外,其余都存放在全局名称空间
局部名称空间
用于存放函数调用期间函数体产生的名字
生命周期:函数调用期间生效,函数执行结束后失效
def f1(): def f2(): print('from f2') f2() f1()
加载顺序
内置-全局-局部
查找顺序
当为局部名称空间:局部-全局- 内置
x = 1 y = 2 len = 100 def func(): y = 3 len = 1000 print(f"y: {y}") print(f"len: {len}") # print(a) # nameerror: name 'a' is not defined func()
y: 3 len: 1000
x = 1 def func(): print(x) x = 10 func()
10
作用域
域指的是区域,作用域即作用区域
全局作用域
全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。
x = 1 def bar(): print(x) bar()
1
局部作用域
局部作用域:局部有小,临时存储,只包含局部名称空间
def f1(): def f2(): def f3(): print(x) x = 2 f3() f2() f1()
2
注意:作用域关系在函数定义阶段就固定死了,与函数的调用无关
# 作用域注意点 x = 1 def f1(): # 定义阶段x=1 print(x) def f2(): x = 2 f1() f2()
1
补充:global:修改全局作用域中的变量
nonlocal修该局部作用域中的变量
x = 1 def f1(): x = 2 def f2(): # nonlocal x x = 3 f2() print(x) f1()
2
x = 1 def f1(): x = 2 def f2(): nonlocal x x = 3 f2() print(x) f1()
3
注意:
在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。
上一篇: 微信分享功能出现签名错误功能导致的原因
下一篇: Java线程安全面试题,你真的了解吗?