我有一个文件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.
为什么一个变量起作用而另一个变量不起作用?我该如何解决这个问题?
答案 0 :(得分:2)
在Python中,在函数内部,如果您在函数中的任何位置分配它们,那么您未明确声明global
或nonlocal
(闭包)的任何变量都将被视为本地变量,非本地(封闭,全球或内置),如果你没有。
所以,假设你全局from settings import *
(如果没有,你有更大的问题...),那就会创建名为DEBUG_MODE
和WRAP_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
重新分配全球,但我怀疑这是您想要的。