当我在公司的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
根据上述2个问题的答案,如果我在script.py文件中的global a
行之后添加def myFunc1():
,则错误消失。
我不明白的是从if
移除myFunc1
条件也可以使其正常工作......
答案 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)