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
似乎无法将变量分配给函数中函数中定义的变量的值,即使在定义第二个函数之前调用第一个函数也是如此。为什么是这样?有没有不同的方法来完成我想做的事情。 (除了不使用函数之外,我还想继续使用函数。)谢谢。
最佳答案
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()
但是您仍然需要将其他变量设为全局
才能访问您在函数中定义的变量。我认为将一个类设置为“holder”并在其中创建您的 mselected
等以便通过该类进行访问会更容易。
class LinkColors():
nhover = MyColors.WHITE
hover = MyColors.RED
mselected = MyColors.BLACK
selected = MyColors.RED
您也可以创建仅返回颜色的函数:
def GetSelected():
return MyColors.RED
您可以获得更多的类,而不是让全局空间变得困惑。
关于python - 将函数中定义的变量的值分配给单独函数中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52581418/