从settings.py导入的变量的UnboundLocalError

时间:2015-04-11 00:59:42

标签: python

我有一个文件settings.py,它定义了以下变量:

DEBUG_MODE = True
WRAP_UP = False

我使用以下方法将设置导入我的脚本:

from settings import *

我可以毫无问题地运行它:

if(DEBUG_MODE):
    # Do something

但是当我跑这个时:

if(WRAP_UP == False):
    # Do something

它给了我以下错误:

UnboundLocalError: local variable 'WRAP_UP' referenced before assignment.

为什么一个变量起作用而另一个变量不起作用?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在Python中,在函数内部,如果您在函数中的任何位置分配它们,那么您未明确声明globalnonlocal(闭包)的任何变量都将被视为本地变量,非本地(封闭,全球或内置),如果你没有。

所以,假设你全局from settings import *(如果没有,你有更大的问题...),那就会创建名为DEBUG_MODEWRAP_UP的全局变量,所以你可以这样做:< / p>

def spam():
    if DEBUG_MODE:
        # Do something

......这很有效。但如果你这样做:

def eggs():
    if WRAP_UP:
        # Do something
    WRAP_UP = True

......不会工作。赋值意味着eggs有一个名为WRAP_UP的局部变量,它隐藏了同名的全局变量。所以,第一行是试图访问那个还没有值的局部变量。

解决方案是一个显式的global语句,它会强制eggs使用全局变量,即使它有一个赋值:

def eggs():
    global WRAP_UP
    if WRAP_UP:
        # Do something
    WRAP_UP = True

当然,假设您希望 eggs重新分配全球,但我怀疑这是您想要的。