函数的全局变量和局部变量
一.定义
''' 局部变量: 在函数内部定义的变量(局部命名空间) 全局变量: 在函数外部定义的或者使用global在函数内部定义(全局命名空间) 作用域: 作用的范围 局部变量作用域: 在函数的内部 全局变量作用域: 横跨整个文件 声明周期: 内置函数 -> 全局变量 -> 局部变量 '''
1. 局部变量
# 1.局部变量 def func(): # 定义局部变量 a = 5 # 获取局部变量 print(a) # 修改局部变量 a = 10 print(a) func() # print(a) error 不能再全局调用局部变量
2. 全局变量
# 定义全局变量 b = 10 # 获取全局变量 print(b) # 修改全局变量 b = 20 def func(): # 可以在函数内部获取全局变量 print(b) func()
3. 使用global在函数内部创建全局变量
def func(): global c c = 200 func() print(c)
4. 使用global在函数内部修改全局变量
d = 300 def func(): global d d = 400 func() print(d)
""" 可以使用global 关键字在函数内部定义一个全局变量 也可以使用global关键字在函数内部修改一个全局变量 """
二. 函数名的使用
def func(): print("我是func函数") return 1111 # 1.函数名是个特殊的变量,可以当做变量赋值 a = "你好" print(a) a = func a() # 函数可以像变量一样销毁 del a # a()
1. 函数名可以作为容器类型数据的元素
def func1(): print("我是func1函数") def func2(): print("我是func2函数") def func3(): print("我是func3函数") lst = [func1,func2,func3] for i in lst: print(i) i() # func1() func2() func3()
2. 函数名可以作为函数的参数
def func4(f): f() func4(func3)
3. 函数名可作为函数的返回值
def func(f): return f res = func(func2) # f <=> func2 => res = func2() res() # ### __doc__ 或者 help查看文档 def eat_bigchang(something): """ 功能: 大肠刺身 参数: 肠子名字 返回值: 吃的状态 """ print("先把{}洗一洗".format(something)) print("找出肠子头放嘴里") print("嘬!!") return "吃完了,满意的放下肠子,擦擦嘴" res = eat_bigchang("猪肠子") print(res) help(eat_bigchang) res = eat_bigchang.__doc__ print(res)
三. 函数的嵌套
""" 函数之间可以互相嵌套 外层的叫做外函数 内层的叫做内函数 """
def outer(): def inner(): print("我是inner函数") inner() outer()
1、 LEGB 原则
""" #找寻变量的调用顺序采用LEGB原则(即就近原则) B —— Builtin(Python);Python内置模块的命名空间 (内建作用域) G —— Global(module); 函数外部所在的命名空间 (全局作用域) E —— Enclosing function locals;外部嵌套函数的作用域(嵌套作用域) L —— Local(function);当前函数内的作用域 (局部作用域) 依据就近原则,从下往上 从里向外 依次寻找 """
四. nonlocal 修改局部变量
""" nonlocal遵循LEGB就近找变量原则 (1)找当前空间上一层的局部变量进行修改 (2)如果找不到,会继续向上寻找 (3)最后什么也没有,直接报错 """
1、找当前空间上一层的局部变量进行修改
def outer(): a = 100 def inner(): nonlocal a a = 200 print(a) inner() print(a) outer()
2、如果找不到,会继续向上寻找
def outer(): a = 100 def inner(): def smaller(): nonlocal a a = 400 print(a) smaller() print(a) inner() print(a) outer()
注意点:nonlocal只能修改局部变量
""" a = 100 def outer(): def inner(): def smaller(): nonlocal a a = 400 print(a) smaller() print(a) inner() print(a) outer() """
3、不使用nonlocal 修改局部变量
def func(): lst = [1,2,3,4] def inner(): lst[-1] = 10 inner() print(lst) func()
五、locals 和 globals
locals 获取当前作用域中所有变量
""" locals 如果在全局,调用locals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域 locals 如果在局部,调用locals之后,获取的是调用之前的所有变量,返回字典,局部空间作用域 """
1、globals 只获取全局空间中所有变量
""" globals 如果在全局,调用globals之后,获取的是打印之前的所有变量,返回字典,全局空间作用域 globals 如果在局部,调用globals之后,获取的是调用之前的所有变量,返回字典,全局空间作用域 """
2、动态批量创建全局变量
2.1、用字符串定义全局变量
dic = globals() print(dic) # 返回的是系统的字典 # 在全局的字典当中,通过添加键值对,自动创建全局变量 # 对应的键时变量名,对应的值是变量指向的值 dic["name"] = "致和" print(name)
2.2、批量定义全局变量
def func(): dic = globals() # 通过在全局系统字典当中,添加键值对,批量创建变量 for i in range(1,6): # "a%d" % (1) => "a1" "a%d" % (2) => "a2" dic["a%d" % (i)] = i # 1~5 func()