Python 从settings.py导入的变量的UnboundLocalError

Python 从settings.py导入的变量的UnboundLocalError,python,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 variabl

我有一个文件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.

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

在Python中,在函数内部,如果未明确声明
全局
非局部
(闭包)变量,则将其指定给函数中的任何位置,则将其视为局部变量;如果未指定,则视为非局部变量(闭包、全局变量或内置变量)

因此,假设您全局地执行设置导入*中的
(如果没有,您会遇到更大的问题…),这将创建名为
DEBUG\u MODE
WRAP\u的全局变量,因此您可以执行以下操作:

def spam():
    if DEBUG_MODE:
        # Do something
…这是有效的。但如果你这样做:

def eggs():
    if WRAP_UP:
        # Do something
    WRAP_UP = True
…那是行不通的。赋值意味着
eggs
有一个名为
WRAP\u
的局部变量,它隐藏了同名的全局变量。因此,第一行尝试访问该局部变量,它还没有值

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

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

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

您是否尝试分配给
WRAP\u
?如果是这样,那就行不通了<代码>导入*<代码>不能这样工作。错误说,在使用它之前,应该运行“RePyPUP=某物”,是否存在“RePasyUp= false”不运行的情况?在函数的中间是否有可能执行此代码>导入< /代码>?如果没有,您是否在其他函数中分配给<代码> WrasyUpUp//Cuth>?忘记了
global WRAP\u
?同样,这是Python 2.x还是3.x?这将改变本模块中的
WRAP\u
,但不会改变其他模块。直观地说,我们可能期望
import*
在导入它的所有模块之间共享导入模块的变量。@user2357112:这是真的,但希望OP足够了解Python中的全局变量和内置变量,他知道自己在做什么,或者愿意学习。我们可以改变一些事情,将导入的变量推到内置变量中,或者尝试隐藏问题,而不是让他在问题出现时解决问题,但我认为这不是一个好主意。