将函数中定义的变量的值分配给单独函数中的变量

时间:2018-09-30 19:31:07

标签: python python-3.x scope

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

即使在第一个函数定义之前就调用了第一个函数,似乎也无法将变量分配给在函数中的函数中定义的变量的值。为什么是这样?有没有其他方法可以完成我要完成的工作。 (除了不使用函数外,我想继续使用函数。)谢谢。

2 个答案:

答案 0 :(得分:1)

Python具有作用域。变量仅在范围内是已知的。您可以定义全局变量,以强制它们在全局范围内可用,但这很混乱,这是不明智的做法。

有关更多信息,请参见Short Description of the Scoping Rules?

您可以将自己的全球化:

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

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

答案 1 :(得分:1)

initcolors()的范围不同于initOtherVars()的范围。您可以创建一个包含所有变量的函数。

或者,如果您希望有两个单独的对象,则可以考虑面向对象的编程,并将一个类的实例提供给另一类。例如:

class initColors():
    def __init__(self):
        self.BLACK = (0, 0, 0)
        self.RED = (255, 0, 0)
        self.WHITE = (255, 255, 255)

MyColors = initColors()

class initOtherVars(initColors):
    def __init__(self, color_class):
        self.nhover = color_class.WHITE
        self.hover = color_class.RED
        self.mselected = color_class.BLACK
        self.selected = color_class.RED

MyOtherVars = initOtherVars(MyColors)

print(MyOtherVars.nhover)  # (255, 255, 255)