zoukankan      html  css  js  c++  java
  • day10函数名称空间与作用域(3)

    # -*- coding: utf-8 -*-

    # @Time:

    # @Auther: kongweixin

    # @File:

    """

    目录:

    一 名称空间

    1.1 内建名称空间

    1.2 全局名称空间

    1.3 局部名称空间

    二 作用域

    2.1 全局作用域与局部作用域

    2.2 作用域与名字查找的优先级

    一 名称空间

        名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,Python会申请内存空间存放对象3,

    然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。在程序执行期间最多会存在三种名称空间

    1.1 内建名称空间

    伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,

    比如内建函数名:

    print(max)

    # 输出结果:<built-in function max>  #built-in内建

    1.2 全局名称空间

    伴随python文件的开始执行/执行完毕而产生/回收,是第二个被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间中,如下名字

    import sys #模块名sys

    x=1 #变量名x

    if x == 1:

        y=2 #变量名y

    def foo(x): #函数名foo

        y=1

        def bar():

            pass

    class Bar:#类名Bar

           pass

    1.3 局部名称空间

    伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间中

    def foo(x):

        y=3 #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中

    名称空间的加载顺序是:内置名称空间->全局名称空间->局部名称空间,而查找一个名字,必须从三个名称空间之一找到,

    查找顺序为:局部名称空间->全局名称空间->内置名称空间。

    二 作用域

    2.1 全局作用域与局部作用域

    按照名字作用范围的不同可以将三个名称空间划分为两个区域:

    2.1.1        全局作用域:位于全局名称空间、内建名称空间中的名字属于全局范围,

    该范围内的名字全局存活(除非被删除,否则在整个文件执行过程中存活)、全局有效

    (在任意位置都可以使用);

    2.1.22.     局部作用域:位于局部名称空间中的名字属于局部范围。该范围内的名字临时存活

    (即在函数调用时临时生成,函数调用结束后就释放)、局部有效(只能在函数内使用)。

    2.2 作用域与名字查找的优先级

      在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,没有找到,

    再去全局作用域查找:先查找全局名称空间,没有找到,再查找内置名称空间,

    最后都没有找到就会抛出异常

    x=100 #全局变量作用域的名字

    def foo():

        x=300 #局部作用域的名字x

        print(x) #在局部找x

    foo() #结果为300

    在全局作用域查找名字时,起始位置便是全局作用域,所以先查找全局名称空间,没有找到,

    再查找内置名称空间,最后都没有找到就会抛出异常

    x=100

    def foo():

        x=300 #在函数调用时产生局部作用域的名字x

    foo()

    print(x) #在全局找x,结果为100

    提示:可以调用内建函数locals()和globals()来分别查看局部作用域和全局作用域的名字,

    查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()

    Python支持函数的嵌套定义,在内嵌的函数内查找名字时,会优先查找自己局部作用域的名字,

    然后由内而外一层层查找外部嵌套函数定义的作用域,没有找到,则查找全局作用域

    x=1

    def outer():

        x=2

        def inner(): # 函数名inner属于outer这一层作用域的名字

            x=3

            print('inner x:%s' %x)

        inner()

        print('outer x:%s' %x)

    outer()

    #结果为

    inner x:3

    outer x:2

        在函数内,无论嵌套多少层,都可以查看到全局作用域的名字,

    若要在函数内修改全局名称空间中名字的值,当值为不可变类型时,

    则需要用到global关键字

    x=1

    def foo():

        global x #声明x为全局名称空间的名字

        x=2

    foo()

    print(x) #结果为2

    当实参的值为可变类型时,函数体内对该值的修改将直接反应到原值,

    """

    """

    重点1:

    名词查找:当前所在的位置向外查找

    局部名称空间-》全局名称空间-》内置名称空间

    重点2:

    名称空间只有优先级之分,本身并无嵌套关系

    重点3:

    名称空间的嵌套关系决定了名字的查找顺序

    而名称空间的嵌套关系是以函数定义阶段为准的,

    即函数的嵌套关系与名字的查找顺序是在定义阶段就已经确定好的

    """

    """

    1、函数对象(可以把函数当成变量去用)

    2、函数嵌套

    3、闭包函数=名称空间与作用域+函数嵌套+函数对象

        核心点:名字的查找关系是以函数定义阶段为准

    """

  • 相关阅读:
    MySQL 主从复制与读写分离概念及架构分析
    删除优先级
    原来的ALL IN ONE架构,快速的演进成为SOA架构
    a=a+1 ++a 效率比较
    Myers–Briggs_Type_Indicator 迈尔斯布里格斯类型指标(MBTI)
    事大众而数摇之,则少成功;藏大器而数徙之,则多败伤
    int float 的具体的取值范围取决于具体的机器 整数除法舍位 整形(int)也可以用于存储字符型数据
    英特尔和 Google 的 OKR 制度与我们一般所说的 KPI 有什么不同?
    Net Promoter Score
    春节问候微信群发
  • 原文地址:https://www.cnblogs.com/kwkk978113/p/13287837.html
Copyright © 2011-2022 走看看