• 学习记录-Python的局部变量和全局变量


    1 定义

    • 在被调用函数内赋值的变量是局部变量
    • 所有函数之外赋值的变量是全局变量

    当一个函数被调用的时候,就会创建一个局部作用域,在这个函数内的所有变量都存在于该局部作用域内(global的变量除外),该函数返回时,这个局部作用域被销毁,这个局部作用域内的局部变量随之丢失

    2 作用域的重要性

    1. 全局作用域中的代码不能使用任何局部变量
    2. 局部作用域中的代码可以访问全局变量
    3. 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
    4. 在不同的作用域中,可以使用相同的名字命名不同的变量

    下面根据具体代码举例说明

    2.1 全局作用域中的代码不能使用任何局部变量

    def spam():
        egg = 'this is in function spam'
        
    spam()
    print(egg)
    

    在函数spam()(局部作用域)中给egg赋值,然后在全局作用域中调用函数spam()

    运行后显示,egg未被定义

    egg是局部变量,而print(egg)中的变量egg是全局变量,全局作用域中的代码不能使用局部作用域中的变量

    这一点我理解为:在调用子函数spam()时,创建了一个局部作用域,并在局部作用域中定义了一个局部变量,当子函数调用结束后,局部作用域和内部定义的局部变量一起没销毁,因此在全局作用域中,找不到egg这个局部变量

    2.2 局部作用域中的代码可以访问全局变量

    def spam():
        print(egg)
    
    egg = 'Outside the function'
    spam()
    

    全局变量在声明或赋值时被创建,直到程序被终止或执行结束

    如果在egg赋值前调用函数

    def spam():
        print(egg)
    
    spam()
    egg = 'Outside the function'
    

    这时候会显示变量未被定义

    2.3 不同局部作用域中的变量不能相互调用

    def spam():
        print(egg)
    
    def init():
        egg = 'this is in init funcion'
    
    init()
    spam()
    

    2.4 在不同的作用域中,可以使用相同的名字命名不同的变量

    def spam():
        egg = 'this is in spam function'
        print(egg)
    
    def init():
        egg = 'this is in init funcion'
        print(egg)
    
    #egg = 'Out side function'
    #print(egg)
    init()
    spam()
    

    两个子函数中都定义了变量egg,但在打印时,互不影响

    3 全局变量与局部变量同名

    在上面说到,可以在局部作用域中调用全局变量,并且在给出的例子中,我们的子函数中只有一个print操作,但如果一个变量既在全局作用域中定义,又在局部作用域中定义,那么会出现什么样的打印结果

    def spam():
        egg = 'this is in spam function'
        print(egg)
    
    def init():
        egg = 'this is in init funcion'
        print(egg)
    
    egg = 'Out side function'
    print(egg)
    init()
    spam()
    

    这里我的理解是:在局部作用域要对一个变量进行操作,Python会先在当前局部作用域查找有没有声明这个变量,如果有,就优先使用当前局部作用域中的变量,如果当前局部作用域作用域中没有,才会去全局作用域中寻找

    4 global

    global允许在局部作用域中声明全局变量

    def spam():
        global egg
        egg = 'In spam function'
    
    spam()
    print(egg)
    

    通过使用global语句在局部作用域中声明了一个全局变量egg,当函数spam()调用结束后变量egg并未随之销毁

    5 全局变量和局部变量的优先级

    在上面的例子中说过,如果在全局变量和局部变量同名,那么局部作用域中会优先处理在当前作用域中声明的的变量

    用下面的例子进一步说明这个问题

    def spam():
        print(egg)
        egg = 'In spam function'
    
    egg = 'Out side function'
    spam()
    

    报错显示局部变量在赋值前被引用,就像前面所说,当在局部作用域中处理一个变量时,Python会先查看这个变量是否在局部作用域中进行声明,然后在会在全局作用域中查找这个变量的声明

    参考内容

    《Python编程快速上手》

  • 相关阅读:
    互联互通,区块链的跨链方式
    C高级第2天
    【ES分词】
    中国纺织数码喷印机行业深度调研与发展趋势预测研究报告
    数据结构-1()
    逆向工程:Python反编译工具的一点介绍(如何还原pyc文件)
    神经网络(十六)Pytorch实机运行的一些细节
    FPGA/SoC控制机械臂
    痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间
    eclipse maven报错again
  • 原文地址:https://www.cnblogs.com/ICcode/p/16754483.html