首页 > 解决方案 > 将函数中定义的变量的值分配给单独函数中的变量

问题描述

def initColors():
   BLACK = (0,0,0)  
   RED = (255,0,0)
   BLUE = (0,0,255)
   LIGHTGRAY = (128,128,128)
   DARKGRAY = (64,64,64)
   WHITE = (255,255,255)
initColors()
def initOtherVars():
   nhover = WHITE
   hover = RED
   mselected = BLACK
   selected = RED
initOtherVars()

我希望它将nhover的值设置为WHITE的值,但我收到此错误:

Traceback (most recent call last):
   File "C:\Users\jarr3\Desktop\Python\Battlr\battlrSelectionScreen1.py", line 30, in <module>
initOtherVars()
   File "C:\Users\jarr3\Desktop\Python\Battlr\battlrSelectionScreen1.py", line 27, in initOtherVars
      nhover = WHITE
NameError: name 'WHITE' is not defined

似乎无法将变量分配给函数中函数中定义的变量的值,即使在定义第二个函数之前调用了第一个函数。为什么是这样?有没有不同的方法来完成我想做的事情。(除了不使用函数,我想继续使用函数。)谢谢。

标签: pythonpython-3.xscope

解决方案


Python 有作用域。变量只在作用域内是已知的。您可以定义全局变量以强制它们在全局范围内可用,但这会使它变得混乱并且这是不好的做法。

有关更多信息,请参阅范围规则的简短描述?.

你可以让你的全球化:

def initColors():
    # declare them global
    global BLACK,RED,BLUE,LIGHTGRAY,DARKGRAY,WHITE
    BLACK = (0,0,0)  
    RED = (255,0,0)
    BLUE = (0,0,255)
    LIGHTGRAY = (128,128,128)
    DARKGRAY = (64,64,64)
    WHITE = (255,255,255)

initColors()

def initOtherVars():
    # need to be global as well, else invalid outside this scope 
    global nhover,hover,mselected,selected
    nhover = WHITE
    hover = RED
    mselected = BLACK
    selected = RED

initOtherVars()

采用这种方式,您首先必须将颜色放入全局空间,然后再放入其他变量。


您可以创建一个将您的颜色保存为类变量的类,这使得它可以通过以下方式访问Classname.Varname

class MyColors:
   BLACK = (0,0,0)  
   RED = (255,0,0)
   BLUE = (0,0,255)
   LIGHTGRAY = (128,128,128)
   DARKGRAY = (64,64,64)
   WHITE = (255,255,255)

def initOtherVarsByClass():
    # these need still to be made global
    global Cnhover,Chover,Cmselected,Cselected
    Cnhover = MyColors.WHITE
    Chover = MyColors.RED
    Cmselected = MyColors.BLACK
    Cselected = MyColors.RED

initOtherVarsByClass()

但是您仍然需要使您的其他变量global能够访问您在函数中定义的变量。我认为将课程设置为“持有者”并在其中创建您的mselected等以通过课程访问会更容易。

class LinkColors():
    nhover = MyColors.WHITE
    hover = MyColors.RED
    mselected = MyColors.BLACK
    selected = MyColors.RED

您也可以创建简单地返回颜色的函数:

def GetSelected(): 
    return MyColors.RED

您可以获得更多类,而不是使全局空间变得混乱。


推荐阅读