python - 将函数中定义的变量的值分配给单独函数中的变量
问题描述
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 有作用域。变量只在作用域内是已知的。您可以定义全局变量以强制它们在全局范围内可用,但这会使它变得混乱并且这是不好的做法。
有关更多信息,请参阅范围规则的简短描述?.
你可以让你的全球化:
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
您可以获得更多类,而不是使全局空间变得混乱。
推荐阅读
- java - 如何确保可以在 Java 中规范化所有“喜欢”字符
- c# - Unity第一个游戏项目-到达目标区域时如何更改场景?
- javascript - 以编程方式从元素中删除 v-on:click 事件 (VueJs)
- mysql - 如何从表 1 的行内的表 2 中选择列
- python - REGEX - NP++ - 使用一个正则表达式从代码的子组中删除填充 0
- c# - 收藏中的“差距”是什么?
- sql - 连接两个表,其中一个表中有多个与另一个表中的单行相关的行
- reactjs - 在 redux-from 中仅重置一个向导
- ngrx - ngrx/angular 6 - 尝试通过效果设置动作和另一个动作的参数
- java - 在创建数据集时使用 @JsonProperty 重命名 spark 中的列