zoukankan      html  css  js  c++  java
  • 零基础学python-16.4 global作用域

    这一章节我们来讨论一下global作用域

    global的本质:不是声明变量类型,而是声明命名空间也就是作用域

    1.全局变量总结:

    1)它位与模块文件内部的顶层

    我们打开test.py模块,里面只有一句,就是下面的一句

    x=1#全局变量,其实就是模块里面所有的函数都可以使用

    2)在函数内部不声明也可以使用

    我们在test.py文件里面加一点代码

    x=1#全局变量,其实就是模块里面所有的函数都可以使用
    def test():
        print(x)
    if __name__=='__main__':
        test()
    
    输出:

    >>> ================================ RESTART ================================
    >>> 
    1
    >>> 


    3)如果在函数里面被赋值,必须经过声明

    沿用上面的代码,我们在test里面增加一句改变x的语句:

    x=1#全局变量,其实就是模块里面所有的函数都可以使用
    def test():
        print(x)
        x=2
    if __name__=='__main__':
            test()
    

    输出:

    >>> ================================ RESTART ================================
    >>> 
    Traceback (most recent call last):
      File "C:/Python34/test.py", line 6, in <module>
        test()
      File "C:/Python34/test.py", line 3, in test
        print(x)
    UnboundLocalError: local variable 'x' referenced before assignment
    >>> 

    就这样改变是不行的,需要加上global声明

    x=1#全局变量,其实就是模块里面所有的函数都可以使用
    def test():
        print(x)
        global x
        x=2
        print(x)
    if __name__=='__main__':
            test()
    
    输出:

    >>> ================================ RESTART ================================
    >>> 
    1
    2
    >>> 

    2.全局变量存在的问题

    使用全局变量,特别是改变全局变量会存在严重的问题,因为你不知道改变这个全局变量的函数的调用顺序,以至于调试非常麻烦,使用起来非常麻烦

    我们把上面的代码改成下面的样子:

    x=1#全局变量,其实就是模块里面所有的函数都可以使用
    def test():
        print(x)
        global x
        x=2
        print(x)
    def test2():
        print(x)
        global x
        x='abc'
        print(x)
        
    if __name__=='__main__':
            test()
            test2()
    

    输出:

    >>> ================================ RESTART ================================
    >>> 
    1
    2
    2
    abc
    >>> 

    现在我们调换一些两个函数的位置

    x=1#全局变量,其实就是模块里面所有的函数都可以使用
    def test():
        print(x)
        global x
        x=2
        print(x)
    def test2():
        print(x)
        global x
        x='abc'
        print(x)
        
    if __name__=='__main__':        
            test2()
            test()
    

    输出:

    >>> ================================ RESTART ================================
    >>> 
    1
    abc
    abc
    2
    >>> 


    因为x随着函数的执行而改变,如果在一个大型项目里面,有千万次的修改x,这样的问题就会非常的严重


    解决这种问题的办法:使用一个文件定义所有的全局变量,把全局变量变成通信的工具,这样才能比较容易的维护

    当然,在不熟悉的前提下,不推荐使用全局变量


    总结:这一章节主要简单说明了global作用域以及使用它需要注意的一些问题



    这一章节就说到这里,谢谢大家

    ------------------------------------------------------------------

    点击跳转零基础学python-目录

     



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    plt.annotate() 在图中标注文字
    numpy 的 ravel() 和 flatten() 扁平化函数
    springboot 国际化
    springboot 日志
    springboot render 和 重定向
    将jar包 引入到maven
    requests 上传图片加额外参数
    java 占位符
    springboot JSR303 后端数据校验
    Python入门学习笔记10:函数式编程:匿名函数、高阶函数、装饰器
  • 原文地址:https://www.cnblogs.com/raylee2007/p/4896738.html
Copyright © 2011-2022 走看看