zoukankan      html  css  js  c++  java
  • 名称空间和作用域

    #变量名和内存地址对应的表叫做名称空间

    # 内置名称空间:(python启动时就有,python自带的)python解释器内置的名字,print,max,min

    # 全局名称空间:(执行python文件时启动,包括if判断得出的结果)定义的变量

    # 局部名称空间:(调用函数时启动,调用结束失效)函数内部定义的变量

    # 总结:三者的加载顺序

    # 内置 - -->全局 - -->局部

    # 三者的访问顺序

    # 局部 - -->全局 - -->内置

    一、函数之名称空间

            1.1、什么是名称空间

            名称空间:存放名字的地方

            例子:S=1,1存放于内存中,那名字 S 存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方

            1.2、名称空间 (存放名字与值的绑定关系)

            1、内置名称空间

                存放python解释器自带名字,比如内置的函数名:len,max,sum

                创建:随着python解释器启动而创建

                销毁:随着python解释器关闭而销毁

           2、全局名称空间

    存放文件级别的名字,比如x,f1,z
    x=1
    
     def f1():
        y=2
        if x == 1:
            z=3    

                创建:文件开始执行时则立即创建

                销毁:文件开始执行完毕时则销毁

            3、局部名称空间

                存放函数内的名字,强调:函数的参数也属于局部的

                创建:函数执行时才临时创建

                销毁:函数执行完毕则立即销毁

            4、名称空间的加载顺序

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

                强调:加载的目的是为了把名字存起来,存起来的目的是为了取出来,那么但凡查找一个名字一定会从三种名称空间之一找到。

            5、名称空间的查找名字顺序

                局部名称空间===>全局名称空间===>内置名称空间

        例子:名称空间加载顺序与名称空间查找名字顺序使用案例

    len=10
    def f1():
        # len=100
        def f2():
            # len=1000
            def f3():
                # len=10000
                print(len)
            f3()
        # len=200
        f2()
    len=11111111111    #这里相当于修改了全局定义的'len=10',修改为'len=11111111111'
    f1()
    
    len=11111111111

      函数的查找关系是在函数定义阶段就已经固定死的,与调用位置无关

     # 函数名字的查找关系是在函数定义阶段就已经固定死的,与调用位置无关

    x=100
    def f1():
        x=10
        print(x)
    
    def f2():
        x=111111
        f1()
    f2()
    
    >>:10

    二、作用域

            全局范围:内置名称空间中的名字,全局名称空间中的名字

                特点:全局有效,全局存活

            局部范围:局部名称空间中的名字

                特点:局部有效,临时存活

            全局变量:定义在全局作用域的名字

            局部变量:定义在局部作用域的名字

            2.1、当全局数据类型是可变类型时,在函数内是可以修改的

    l=[]             #全局类型(可变数据类型)
    def foo1():
        l.append(2)  #在函数内往全局类型里面追加数据
    foo1()
    print(l)         
    >>:[2]              #追加完毕后,全局类型l的值已经为[2]
            2.2、当全局数据类型是不可变类型时,在函数内不能修改
    
    L=100             #全局类型(不可变类型)
    def foo1():
        L=222         #在函数内定义L的值为222
    foo1()
    print(L)
    >>:100           #执行后全局类型L的值并没有被修改
  • 相关阅读:
    NIST SIEM IR RISK
    Django 部署时得到 Bad Request (400)(DEBUG = False)
    MongoDB入门-插入文档
    MongoDB入门-MongoDB的基本操作
    MongoDB入门-Windows操作系统中将Mongodb设置为系统服务
    MongoDB入门-Windows操作系统中Mongodb数据库的安装部署
    Nginx反向代理功能-实现动静分离
    Nginx反向代理功能-使用upstream指令反向代理多台web服务器案例
    Nginx反向代理功能-添加头部报文信息
    Nginx反向代理功能-缓存功能
  • 原文地址:https://www.cnblogs.com/leeeel/p/10816128.html
Copyright © 2011-2022 走看看