三、名称空间

  • python分为三个空间:

    • 全局名称空间,当前的py文件

    • 局部名称空间,函数,函数执行时才开辟

    • 内置名称空间,builtins.py

  • 加载顺序,取值顺序

    • 加载顺序:内置名称空间——> 全局名称空间 ——>局部名称空间

    • 取值顺序(就近原则)(LEGB):单项不可逆

      (从局部找时)局部名称空间——> 全局名称空间——>内置名称空间

  • 作用域

    两个作用域:

    • 全局作用域:内置名称空间、全局名称空间

    • 局部作用域:局部名称空间

      • 局部作用域可以引用全局

      • 局部作用域不能改变全局作用域的变量,当Python解释器读取到局部作用域时,发现你对一个变量进行修改的操作,解释器会认为你在局部已经定义过这个局部变量了,他就从局部找这个局部变量,报错了

      

    • # 作用域:
      # 两个作用域:
         # 全局作用域 :内置名称空间 全局名称空间
         # 局部作用域:局部名称空间

      # 局部作用域可以引用全局作用域的变量
      # date = '周五'
      # def func():
      #     a = 666
      #     print(date)
      # print(a)
      # func()
      # print(a)

      # 局部作用域不能改变全局变量。
      # count = 1
      # # def func():
      # #     count += 2
      # #     print(count)
      # # func() # local variable 'count' referenced before assignment
      # 局部作用域不能改变全局作用域的变量,当python解释器读取到局部作用域时,发现了你对一个变量进行修改的操作,
      # 解释器会认为你在局部已经定义过这个局部变量了,他就从局部找这个局部变量,报错了。

      # 使用可以,不能改变
      # def func():
      #     count = 1
      #     def inner():
      #         print(count)
      #     inner()
      # func()

      def func():
         count = 1
         def inner():
             count += 1
             print(count)
         inner()
      func()

       

  1. 函数的嵌套(高阶函数)

    # 例1:
    def func1():
       print('in func1')
       print(3)

    def func2():
       print('in func2')
       print(4)

    func1()
    print(1)
    func2()
    print(2)
    # in func1 3 1 in func2 4 2



    # 例2:
    def func1():
       print('in func1')
       print(3)

    def func2():
       print('in func2')
       func1()
       print(4)

    print(1)
    func2()
    print(2)
    #1 in func2 in func1 3 4 2


    # 例3:
    def fun2():
       print(2)

       def fun3():
           print(6)

       print(4)
       fun3()
       print(8)

    print(3)
    fun2()
    print(5)
    #3 2 4 6 8 5

     

# 作用域:# 两个作用域:    # 全局作用域 :内置名称空间 全局名称空间    # 局部作用域:局部名称空间
#  局部作用域可以引用全局作用域的变量# date = '周五'# def func():#     a = 666#     print(date)# print(a)# func()# print(a)
# 局部作用域不能改变全局变量。# count = 1# # def func():# #     count += 2# #     print(count)# # func()  # local variable 'count' referenced before assignment# 局部作用域不能改变全局作用域的变量,当python解释器读取到局部作用域时,发现了你对一个变量进行修改的操作,# 解释器会认为你在局部已经定义过这个局部变量了,他就从局部找这个局部变量,报错了。
# 使用可以,不能改变# def func():#     count = 1#     def inner():#         print(count)#     inner()# func()
def func():    count = 1    def inner():        count += 1        print(count)    inner()func()

原文地址:https://www.cnblogs.com/yangzm/p/10921537.html