Python 从settings.py导入的变量的UnboundLocalError
我有一个文件settings.py,其中定义了以下变量: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
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中的全局变量和内置变量,他知道自己在做什么,或者愿意学习。我们可以改变一些事情,将导入的变量推到内置变量中,或者尝试隐藏问题,而不是让他在问题出现时解决问题,但我认为这不是一个好主意。