名称空间

名称空间:
  内置 全局 局部

  内置命名空间 存放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修改父类离得最近的非全局的变量



原文地址:https://www.cnblogs.com/shicongcong0910/p/10387747.html