第七章、函数基础之名称空间和作用域10

流过昼夜 提交于 2019-11-26 23:47:57

第七章、函数基础之名称空间和作用域

说明:函数内部的函数只能在函数内调用,不能在函数外部调用

一、名称空间

内存有一块内存存储变量名与变量间的绑定关系的空间,这个空间就叫做名称空间

  1. 1内置名称空间

    内置名称空间:存放py解释器自带的名字,如int、float、len

  2. 2全局名称空间

    全局名称空间:除了内置和局部的名字之外,其余都放在全局空间,如下面代码中的x\func\1\z

    生命周期:在文件执行时生效,文件执行结束后失效

    x = 1   def func():     pass   l = [1, 2]  if 3 > 2:     if 4 > 3:         z = 3

    1.3 局部名称空间

    局部名称空间:用于存放函数调用期间函数体产生的名字,如下面的f2

    生命周期:在文件执行时函数调用期间生效,在函数执行结束后失效

    def f1():     def f2():         print('from f2')     f2()  f1()

    1.4 加载顺序

    由于.py文件是由Python解释器打开的,因此一定是在Python解释器中的内置名称空间加载结束后,文件才开始打开,这个时候才会产生全局名称空间,但文件内有某一个函数被调用的时候,才会开始产生局部名称空间,因此名称空间的加载顺序为:内置--》全局--》局部。

    1.5 查找顺序

    由于名称空间是用来存放变量名与值之间的绑定关系的,所以但凡要查找名字,一定是从三者之一找到,查找顺序为: 从当前的所在位置开始查找,如果当前所在的位置为局部名称空间,则查找顺序为:局部--》全局--》内置。

    x = 1 y = 2 len = 100   def func():     y = 3     len = 1000     print(f"y: {y}")     print(f"len: {len}")     # print(a)  # NameError: name 'a' is not defined   func()

    y: 3

    len: 1000

    x = 1   def func():     print(x)   x = 10 func()

    10

二、作用域

1.全局作用域:全局有效,全局存活,包含内置空间和全局名称空间

# 全局作用域 x = 1   def bar():     print(x)   bar()

1

2.局部作用域

局部作用域:局部有效,临时存储,只包含局部名称空间

# 局部作用域 def f1():     def f2():         def f3():             print(x)         x = 2         f3()     f2()   f1()

2

3.注意点:

# 作用域注意点 x = 1   def f1():  # 定义阶段x=1     print(x)   def f2():     x = 2     f1()   f2()

1

4.函数对象+作用域

# 作用域应用 def f1():     def inner():         print('from inner')     return inner   f = f1()  # 把局部定义的函数放在全局之中   def bar():     f()   bar()

from inner

三、global关键字

作用:修改全局作用域的变量

x = 1   def f1():     x = 2      def f2():         #         global x  # 修改全局         x = 3     f2()   f1() print(x)

1

x = 1   def f1():     x = 2      def f2():         global x  # 修改全局         x = 3     f2()   f1() print(x)

3

四、nonlocal关键字

作用:修改局部作用域的变量

x = 1   def f1():     x = 2      def f2():         #         nonlocal x         x = 3      f2()     print(x)   f1()

2

x = 1   def f1():     x = 2      def f2():         nonlocal x         x = 3      f2()     print(x)   f1()

3

注意

  1. 在局部修改为全局的可变类型,不需要任何声明,可以直接修改
  2. 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,可以直接修改
lis = []   def f1():     lis.append(1)   print(f"调用函数前: {lis}") f1() print(f"调用函数后: {lis}")
调用函数前: [] 调用函数后: [1]
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!