2016-04-21 47 views
1

当我在我公司的Python项目执行测试脚本的另一个UnboundLocalError,我得到了一个错误如下:在Python2.7

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文件中添加了def myFunc1():线global a后,该错误消失。

我不明白的是从myFunc1去除if条件也使它发挥作用的事情...

+0

的Python在编译time_ _statically决定局部变量。无论何时在函数的任何位置有一个赋值变量,该变量在_whole函数body_中被认为是本地的,包括第一个'print'语句。 –

回答

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 amyFunc1第一行会告诉Python的,当它看到一个分配a它不应该创建一个局部变量。它几乎肯定不会达到你期望的效果(假设你预计的a被改变..)。 from vars import *vars中创建名称的本地“副本”,并且使用global语句仅表示您正在为分配此模块的a变量。导入vars的其他模块将看不到分配。

删除if语句也会删除赋值,这就是为什么消除了该错误。

据我所知,瓦尔导入*和在 vars.py使用变量是不是一个很好的设计,但我可以不通过所有需要的变量 以来该功能可以使用功能20+在公司的项目

不寒而栗从 vars.py变量..请重构。

对于这个特定的问题,您应该使用这种模式:

import vars 

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

感谢thebjorn的答案!你是对的!如果我使用'global a',执行分配时只会在'myFunc1'中更改'a'变量。如果我使用'vars.a','myFunc1'调用后'a'变量被改变。你已经解决了我的问题,再次感谢!附:该公司的项目用于UI测试,而vars.py存储许多常见的UI元素名称。通常我们不应该改变vars.py中的变量,但是在Linux上,一些UI元素名称的改变取决于它们的内容。 :( –

0

你应该是值传递给函数,而不是依赖于全局变量。另外如果False没有做任何事情,因为它总是会返回True。您可能意味着如果变量说:

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


def myFunc1(x): 
    print x 

    if x: 
     x = '111' 

    print x 

myFunc1(a) 
+1

感谢您的回答!这只是一个示例代码,公司项目中需要'if'条件语句。我公司项目中的script.py被设计为在Windows和Linux上运行。将'if False:'语句更改为'如果不是onWindows():'更合理。当我在Windows上运行脚本时,'if'中的语句不会执行。 –

+0

我知道'from vars import *'和在vars.py中使用变量不是一个好的设计......但是我无法将所有需要的变量传递给该函数,因为该函数可能会使用来自变量的20多个变量。 py在公司的项目中... –