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