繁体   English   中英

Python2.7中的另一个UnboundLocalError

[英]Another UnboundLocalError in Python2.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:赋值Python之前引用了局部变量'L'

Python中的UnboundLocalError

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

我不明白的是从myFunc1删除if条件也可以使它工作...

分配名称会使该名称成为局部变量,这意味着没有附加语法就无法分配给非局部变量。 在您的代码中:

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 in vars被更改。)。 from vars import *创建了本地名称的“副本” vars ,并使用global声明只是意味着你要指派给模块是a变量。 导入vars其他模块将看不到分配。

删除if语句也会删除分配,这就是为什么可以消除错误的原因。

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

颤抖 ..请重构。

对于此特定问题,应使用以下模式:

import vars

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

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

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


def myFunc1(x):
    print x

    if x:
        x = '111'

    print x

myFunc1(a)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM