首页 > 编程语言 >Python系列(7)| 命名空间、作用域

Python系列(7)| 命名空间、作用域

时间:2024-08-22 19:27:46浏览次数:9  
标签:__ 变量 作用域 print Python func 命名 函数

 

1. 命名空间 (Namespace)

    Python 中的 命名空间 (Namespace) 和作用域是密切相关的概念。Python 命名空间 (Namespace) 可以视为一个字典,其中键是变量名,值是与之关联的对象。

    各个命名空间是独立的,同一个命名空间中不能有重名(重名的以后一个为准),不同的命名空间是可以重名。
    
    命名空间类似于电脑的文件系统,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。

    一般有三种命名空间:

        内置名称 (built-in names): Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等;
        全局名称 (global names): 模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量;
        局部名称 (local names): 函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。

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

    命名空间的生命周期:命名空间的生命周期取决于对象的作用域,对象执行完成,则该命名空间的生命周期就结束。

2. 作用域

    作用域就是 Python 程序可以直接访问命名空间的范围,或者说变量的有效范围。

    Python 的作用域有 4 种:

        L(Local):最内层,包含局部变量,比如一个函数/方法内部。
        E(Enclosing):包含了非局部 (non-local) 也非全局 (non-global) 的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
        G(Global):当前脚本的最外层,比如当前模块的全局变量。
        B(Built-in): 包含了内置的变量/关键字等。

    作用域查找遵循 LEGB 规则:
    
        Local -> Enclosing -> Global -> Built-in
    
    内置作用域是通过一个名为 builtins 的标准模块来实现的,查看内置作用域里的变量和关键字,可以运行如下代码:

        import builtins
        print(dir(builtins))

        注:可是使用 dir() 函数查看模块、类、对象等结构内部所包含的属性列表和方法列表。

    Python 中只有模块(module)、类(class)和函数(def、lambda)才会引入新的作用域,其它的代码块(比如 if/elif/else/、try/except、for/while 等)不会引入新的作用域。
    
    示例:
        #!/usr/bin/python3
        # -*- coding: UTF-8 -*-

        # 全局变量
        s = 'Global'
        def func():

            # nonlocal 变量
            s = 'Enclosing'

            def inner_func():
                # 局部变量
                s = 'Local'
                print(s)    # 输出局部变量 s
                
            inner_func()
            print(s)    # 输出 nonlocal 变量 s

        if __name__ == "__main__":
            func()
            print(s)    # 输出全局变量 s
            print(x)    # 输出未定义变量 x

    输出结果如下:
        Local
        Enclosing
        Global
        Traceback (most recent call last):
        File "d:/pythonDemo/func3.py", line 22, in <module>
            print(x)    # 输出未定义变量 x
        NameError: name 'x' is not defined


        注:在各命名空间都找不到变量 x, 抛出了一个 NameError 异常。
        
    在 fun() 作用域内,给 s 赋值 'Enclosing',没有改变全局变量 s 的值。在 inner_func() 作用域内,给 s 赋值 'Local',没有改变nonlocal 变量 s 的值。在作用域内,想要修改作用域外的变量,需要用到 global 或 nonlocal 关键字。

 

3. global 和 nonlocal 关键字

    在 Python 中,global 关键字用于标识变量是全局的。如果在函数内部要修改全局变量,需要使用 global 关键字。

    nonlocal 关键字是用于标识变量是外部的(非全局)。如果在函数内部要修改外部函数的变量,需要使用 nonlocal 关键字。

    示例1:

        #!/usr/bin/python3
        # -*- coding: UTF-8 -*-

        # 全局变量
        s = 'Global'
        def func():

            # nonlocal 变量
            s = 'Enclosing'

            def inner_func():
                # 标识 s 是全局变量
                global s
                s = 'Local'
                print(s)    # 输出全局变量 s
                
            inner_func()
            print(s)    # 输出 nonlocal 变量 s

        if __name__ == "__main__":
            func()
            print(s)    # 输出全局变量 s 


    输出结果如下:

        Local
        Enclosing
        Local

    示例2:

        #!/usr/bin/python3
        # -*- coding: UTF-8 -*-

        # 全局变量
        s = 'Global'
        def func():

            # nonlocal 变量
            s = 'Enclosing'

            def inner_func():
                # 标识 s 是 nonlocal 变量
                nonlocal s
                s = 'Local'
                print(s)    # 输出 nonlocal 变量 s
                
            inner_func()
            print(s)    # 输出 nonlocal 变量 s

        if __name__ == "__main__":
            func()
            print(s)    # 输出全局变量 s


    输出结果如下:

        Local
        Local
        Global


4. 获取作用域范围中的变量

    1) globals() 函数

        globals() 函数是 Python 的内置函数,在函数内外调用(包括全局作用域),都返回一个全局变量字典。

        示例:

            #!/usr/bin/python3
            # -*- coding: UTF-8 -*-

            # 全局变量
            a = 1
            b = 2
            c = 3
            def func():
                # nonlocal 变量
                i = 11
                j = 12
                
                def inner_func():
                    # 局部变量
                    x = 101
                    y = 102
                    
                inner_func()

            if __name__ == "__main__":
                print(globals())


            输出结果如下:

                {... , 'a': 1, 'b': 2, 'c': 3, ...}

            注: globals() 函数返回的字典中,会默认包含有很多下划线变量,它们是 Python 主程序内置的属性和方法,不用管它们。

    2) locals() 函数

        locals() 函数也是 Python 的内置函数,在函数内外调用,返回一个当前作用域内所有变量的字典。

        示例:

            #!/usr/bin/python3
            # -*- coding: UTF-8 -*-

            # 全局变量
            a = 1
            b = 2
            c = 3
            def func():
                # nonlocal 变量
                i = 11
                j = 12
                print(locals())
                
                def inner_func():
                    # 局部变量
                    x = 101
                    y = 102
                    print(locals())
                    
                inner_func()

            if __name__ == "__main__":
                func()
                print(locals())


        输出结果如下:

            {'i': 11, 'j': 12}
            {'x': 101, 'y': 102}
            {... , 'a': 1, 'b': 2, 'c': 3, ...}

        注: 在函数内部调用 locals() 函数,会获得包含所有局部变量的字典;在全局作用域调用,locals() 的功能和 globals() 函数相同。

    3) vars(object) 函数

        vars(object) 函数也是 Python 内置函数,其功能是返回一个指定 object 对象范围内所有变量组成的字典。

        示例:

            #!/usr/bin/python3
            # -*- coding: UTF-8 -*-

            # 全局变量
            a = 1
            b = 2
            c = 3

            class Person:
                name = 'Python'
                age = 20

            if __name__ == "__main__":
                print(vars(Person))
                print(vars())


        输出结果如下:

            {..., 'name': 'Python', 'age': 20, ...}
            { ... 'a': 1, 'b': 2, 'c': 3, ...}

        注:如果不传入 object 参数,vars() 和 locals() 的作用完全相同。

标签:__,变量,作用域,print,Python,func,命名,函数
From: https://www.cnblogs.com/tkuang/p/18374569

相关文章

  • PCA原理与水果成熟状态数据分析实例:Python中PCA-LDA 与卷积神经网络CNN
    全文链接:https://tecdat.cn/?p=37450 主成分分析(PCA)作为数据科学中用于可视化和降维的重要工具,在处理具有大量特征的数据集时非常有用。就像我们难以找到时间阅读一本1000页的书,而更倾向于2到3页的总结以抓住整体概貌一样,当数据集中特征过多时,PCA可以帮助我们减少维度,提......
  • python 04-标准库:pathlib模块
    pathlib模块pathlib模块‌:是面向对象的文件系统路径操作库,提供接口来处理文件路径。Path是主类Path:Path对象表示文件或目录的路径,Path类会自动选择PosixPath或WindowsPath,具体取决于我们的操作系统......
  • Python系列(6)- Python 函数、Python 装饰器
    函数在数学上的定义:给定一个非空的数集A,对A施加对应法则f,记作f(A),得到另一数集B,也就是B=f(A),那么这个关系式就叫函数关系式,简称函数。简而言之,两个变量x和y,如果每给定x的一个值,y都有一个确定的值与其对应,那么我们就说y是x的函数。其中,x叫做自变量,y叫做因变量......
  • python03-标准库 第三方库-pathlib模块
    python标准库:Python自带的一组模块和库,这些模块和库提供了Python编程所需的基础功能和工具https://docs.python.org/zh-cn/3/library/index.html?eqid=8ca0b3ea000067990000000264800802Python包索引:即PyPI(PythonPackageIndex),是一个仓库,存放了许多可以通过pip安装的独......
  • python模块之psutil
    模块介绍psutil是一个Python的跨平台库,用于获取系统和进程的运行状态以及实时信息。它能够方便地访问系统的CPU、内存、磁盘、网络等资源的使用情况。此外,psutil也能够管理和监控进程,非常适合用于系统监控和性能分析等应用。psutil库适用于Python3.x版本,自版本5.0.0起......
  • Python中matplotlib使用4
    在matplotlib中,可以通过绘制“饼图”来展示各类别在总体中所占的比例。1绘制基本“饼图”通过matplotlib中的pie()函数绘制饼图,代码如图1所示。图1绘制基本“饼图”的代码从图1中可以看出,pie()函数的参数y即为要绘制的数据,绘制出的“饼图”如图2所示。图2基本“饼图......
  • Python中定义和使用类的私有属性和方法
    类的私有属性和方法指的是只能在类的内部使用,而不能在类外使用的属性和方法。1单下划线方式在定义类的属性和方法时,在名字前面加一个下划线,此时表示该属性或方法只能在类的内部使用,而不能在类的外部使用,代码如图1所示。图1定义类的私有属性从图1中可以看出,在类Myclass中......
  • Python中类的使用4
    在Python中,如果要编写的类是另一个类的特殊版本,可以使用继承。一个类A继承另一个类B,类A将自动获得类B的所有属性和方法,类B叫做父类,而类A叫做子类。假设有一个类是表示“人”的类,而另一个类是表示“学生”的类,因为“学生”是“人”的特殊版本,因此可以把表示“人”的类当作父类,表......
  • python3脚本批量重命名歌曲文件
    场景:歌曲文件名有些混乱 于是想用个脚本批量重命名这些歌曲文件,可以选择【歌曲名-歌手】或【歌手-歌曲名】规范这些文件名脚本如下:importosimportrefrommutagen.id3importID3,TIT2,TPE1frommutagen.mp4importMP4#替换后歌手分隔符REPLACEMENT_STRING......
  • 【整理快速通道】python语法import速查
    这段文字是特意发送在除了CSDN以外的其他网站的,如果这段文字出现在CSDN里面,则说明该账号为抄袭账号,关键字索引:抄袭千思的文章目录正文文件夹结构模块调用包内模块1.import2.from...import...3.import...as4.from...import*(不推荐)同级两个模块导入from...import动态导入try.......