名称空间:
内置 全局 局部
内置命名空间 存放python解释器为我们提供的名字list str tuple之类的
全局命名空间 直接在py文件中,函数外部声明的变量都是属于命名空间
局部命名空间 在函数中声明的变量
取值顺序:
在局部取值的时候:
局部空间 全局空间 内置空间
在全局取值的时候:
全局空间 内置空间
从小范围到大范围逐步寻找
加载顺序:
1.内置空间
2.全局空间
3.局部空间
作用域:就是作用范围,按照生效范围来分为全局作用域和局部作用域
全局作用域:包含命名空间和全局命名空间 在整个文件的任何位置都可以能被引用,全局有效(遵循从上到下逐步执行)
局部作用域:只能在局部空间,只能在局部内或者函数内部可以使用
globals() 查看全局变量
locals() 查看局部变量
a = 10 def func(): a = 40 b = 20 def abc(): print("哈哈") print(a, b) # 这里使用的是局部作用域 print(globals()) # 打印全局作用域中的内容 print(locals()) # 打印局部作用域中的内容 abc() func()
结果:
哈哈
40 20
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000006B5A20>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:/Users/Administrator/PycharmProjects/untitled/函数复习.py', '__cached__': None, 'a': 10, 'func': <function func at 0x00000000003B1E18>}
{'b': 20, 'a': 40
修改全局变量:
a = 10 def func(): def abc(): global a #声明修改全局变量a a = 22 #对a进行修改 print(a) abc() func() print(a) 结果: 22 22
global修改全局变量 但是只能在局部修改 在全局会报错,glabol(仅限于字符串 和 数字)
a = 10 def func(): a = 22 def abc(): nonlocal a #声明父类离得最近的非全局变量a a =66 #对a进行修改 print(a) abc() print(a) func() print(a) 结果: 66 66 10
nolocal修改父类离得最近的非全局的变量