zoukankan      html  css  js  c++  java
  • Python UnboundLocalError: local variable 'xxx' referenced before assignment 解决方法

    一、报错含义:

    val=9
    def test():
        print(val)
        val = 6
        print(val)
    test()

    翻译:本地变量xxx引用前没有定义。

     

    二、报错原因

    这是Python变量作用域的问题的问题导致的:

    1. 内部函数,不修改全局变量可以访问全局变量
    2. 内部函数,修改同名全局变量,则python会认为它是一个局部变量
    3. 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError
    val=9  #val现在是全局变量
    def test():
        print(val) #引用局部变量,但局部变量未在函数内定义,报局部变量未定义的error
        val = 6  #函数内,修改了同名全局变量,则变量val会被认为是局部变量,所以在上一句“print(val)”引用该变量时,被认为是局部变量的val,又没有在引用前定义,所以Unbound-LocalError
        print(val)
    test()

     

    三、解决方法

    如果想在函数里修改同名全局变量的值之前引用该变量,就需要在函数内引用前用global关键字将被认为是局部的变量定义为全局变量。如下:

    val=9
    def test():
        global val #将局部变量再次定义为全局变量
        print(val) #可以直接引用全局变量
        val = 6  #修改了同名全局变量,变量val会被认为是局部变量,但是在“print(val)”引用该变量之前,将变量又再次定义为全局变量,所以可能正确被引用,且修改的是全局同一个变量
        print(val)
    test() 
    print(val) #全局变量已在函数内被修改

    打印结果:

    9
    6
    6

    如果只是想在函数内使用同名变量,而不改变函数外全局变量的值,则直接在函数内引用该变量前,初始化即可。如下:

    val=9
    def test():
        val = 0 #定义局部变量val
        print(val) #引用局部变量
        val = 6  #修改局部变量,不会影响到全局变量的值
        print(val) #引用局部变量
    test() 
    print(val) #引用全局变量,不受函数内的局部变量影响

    打印结果:

    0
    6
    9

     

  • 相关阅读:
    [团队项目] Scrum 项目 3.0 SCRUM 流程的步骤2: Spring 计划
    《构建之法》第6-7章读后感
    【操作系统】实验二 作业调度模拟程序
    团队项目2.0软件改进分析MathAPP
    团队项目
    结对编程2.0
    电影(网剧))项目
    实验0 了解和熟悉操作系统
    复利计算
    学习进度条
  • 原文地址:https://www.cnblogs.com/l199616j/p/13904202.html
Copyright © 2011-2022 走看看