02函数作用域
只有函数、模块、类才能引入新的作用域
LEGB规则:搜索变量的优先级顺序依次是:局部作用域>外层作用域>当前模块中的全局>python内置作用域
Python中的作用域分4种情况:
L:local 局部作用域,即函数中定义的变量
E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的
G:global,全局变量,就是模块级别定义的变量
B:built in ,系统固定模块里面的变量,比如int、bytearray等。
下面看看3个例子
count = 10 #全局变量 def outer(): print(count) count = 5 outer() # UnboundLocalError: local variable 'count' referenced before assignment # 即是变量在调用时没有声明
# 面试常出题,有坑 count = 10 def outer(): count += 1 #等价于 count = count + 1 outer() # UnboundLocalError: local variable 'count' referenced before assignment # 也是变量在调用前没有声明
# 可以的情况 count = 10 def outer(): count = 5 # 重新定义一个局部变量,不是在局部里修改全局变量的值,不影响全局变量的结果 print(count) # 5 outer() print(count) # 10 即打印的全局变量,函数执行结束后其内部的变量不被调用。全局变量的值不变
总而言之,想要在函数局部里修改全局变量(不是重新定义变量),得要声明,下面有两种需要声明的情况。
局部里修改全局变量方法:global
count = 10 def outer(): global count #声明全局变量 print(count) #10 顺利调用全局变量 count += 8 #局部里顺利修改全局变量 print(count) #18 outer() print(count) #18 全局变量被修改了
子层函数里修改嵌套的父级函数的局部作用域
def outer(): count = 10 def inter(): nonlocal count #声明嵌套的父级函数的局部作用域 print(count) #10 count += 2 #子层函数里修改父级函数的作用域 inter() print(count) #12 父级函数的局部作用域变量被修改 outer()
这些是个人在学习过程中整理的笔记,仅供参考!欢迎大家指正和提问!整理不容易,花了不少时间,后续会接着整理,要是觉得好对您有用还请不要忘了点赞收藏转发+关注哦🤞🤞🤞