Python2.7中的另一个UnboundLocalError

时间:2016-04-21 14:27:34

标签: python python-2.7

当我在公司的Python项目中执行测试脚本时,出现如下错误:

UnboundLocalError: local variable 'a' referenced before assignment

我写了一些更简单的代码来重现这个问题,它有2个文件。

vars.py文件:

#!/usr/bin/env python
a = 'aaa'

script.py文件:

#!/usr/bin/env python
from vars import *


def myFunc1():
    print a

    if False:
        a = '111'

    print a

myFunc1()

执行代码:

$ python --version
Python 2.7.10
$ python script.py 
Traceback (most recent call last):
  File "script.py", line 13, in <module>
    myFunc1()
  File "script.py", line 6, in myFunc1
    print a
UnboundLocalError: local variable 'a' referenced before assignment
$ 

我用Google搜索UnboundLocalError并找到了一些有用的信息,如:

UnboundLocalError: local variable 'L' referenced before assignment Python

UnboundLocalError in Python

根据上述2个问题的答案,如果我在script.py文件中的global a行之后添加def myFunc1():,则错误消失。

我不明白的是从if移除myFunc1条件也可以使其正常工作......

2 个答案:

答案 0 :(得分:1)

分配名称会使名称成为局部变量,这意味着您无需额外语法就可以分配给非局部变量。在您的代码中:

from vars import *

def myFunc1():
    print a         # the local variable `a` is used before it is created
    if False:
        a = '111'   # this creates a local variable `a`
    print a

添加global a作为myFunc1中的第一行会告诉Python,当它看到a的分配时,它不应该创建局部变量。它几乎肯定不会达到您的预期(假设您希望更改a中的vars ...)。 from vars import *创建本地&#34;副本&#34; vars中的名称,并使用global语句仅表示您正在分配模块的a变量。导入vars的其他模块将看不到分配。

删除if语句也会删除赋值,这就是消除错误的原因。

  

据我所知,从vars导入*并使用变量   vars.py不是一个好的设计......但是我无法传递所有需要的变量   因为函数可能使用了20多个变量   vars.py在公司的项目中

不寒而栗 ..请重构。

对于这个特殊问题,你应该使用这种模式:

import vars

def myFunc1():
    print vars.a
    if False:
        vars.a = '111'
    print vars.a

答案 1 :(得分:0)

您应该将值传递给函数,而不是依赖于全局变量。此外,如果False没有真正做任何事情,因为它将始终返回True。你可能想说变量:

#!/usr/bin/env python
from vars import *


def myFunc1(x):
    print x

    if x:
        x = '111'

    print x

myFunc1(a)