美文网首页
Python局部变量和全局变量的坑

Python局部变量和全局变量的坑

作者: BenjaminY | 来源:发表于2019-03-07 11:48 被阅读0次

    PyCharm编译不报错,但运行报错,可能是编译器认为while True可能不会进入,所以编译不报错

    use_width = 400
    def write():
        # global use_width
        while True:
            a = use_width
            use_width =100
            print(a)
            print(use_width)
    write()
    

    编译器报错,错误与以上代码相同:UnboundLocalError: local variable 'use_width' referenced before assignment

    use_width = 400
    def write():
        # global use_width
        a = use_width
        use_width =100
        print(a)
        print(use_width)
    write()
    

    编译运行均不报错:

    use_width = 400
    def write():
        # global use_width
        a = use_width
        print(a)
        print(use_width)
    write()
    ---
    C:\Users\hy\PycharmProjects\LoadVideo\venv\Scripts\python.exe C:/Users/hy/PycharmProjects/LoadVideo/test.py
    400
    400
    
    Process finished with exit code 0
    

    总结:

    1. 如果使用global关键字声明变量为全局变量,则直接使用全局变量进行读取和写入,无歧义
    2. 如果没有global关键字对全局变量的声明,则分2种情况:
      a.如果函数体内没有对全局变量名赋值操作,则直接读取全局变量值使用,没有问题
      b.如果函数体内有对全局变量名的赋值操作,则编译器会认为赋值处定义了局部变量,并且绑定此变量名到此局部变量,并影响整个函数体内的相同变量名。这样一来,如果在赋值操作前进行了全局变量名使用则会报错“UnboundLocalError: local variable 'use_width' referenced before assignment”。解决:此时必须将赋值操作放在函数内此变量使用前,或者在函数开头使用global引入全局变量来进行读取使用,具体操作根据实际业务逻辑需求确定。

    相关文章

      网友评论

          本文标题:Python局部变量和全局变量的坑

          本文链接:https://www.haomeiwen.com/subject/snxcpqtx.html