Python: 使用字典作为开关不工作
我刚开始学习Python,想弄明白字典这种数据类型是怎么工作的。昨晚我试着在一个openGL程序中用字典来控制键盘输入,就像用switch语句一样。
但我遇到的问题是,不知道为什么字典会把所有的情况(在这个例子中是两个)都评估一遍,而不是只处理我按下的那个键。
下面是一段代码示例:
def keyboard(key):
values = {
110: discoMode(),
27: exit()
}
values.get(key, default)()
我昨晚花了一个多小时试图找出为什么每个“情况”都会被评估,我有一些想法,但就是没能清楚地找到“为什么”的答案。
所以,有人能帮我解释一下吗?当我按下“n”键(它的ascii值是110)时,为什么这段代码也会评估到27(ESC键)对应的内容呢?
如果这个话题已经被讨论得很透彻,我很抱歉,但我找了很久也没能轻易找到明确的答案(也许我错过了)。
谢谢大家。
3 个回答
0
只需要去掉括号,这样你就引用了函数本身,而不是调用这个函数后的结果。否则,你实际上是在明确地说:“调用这个函数来获取与这个键关联的值。”
def keyboard(key):
values = {
110: discoMode,
27: exit
}
values.get(key, default)()
15
你不应该直接调用这些函数。只需要把函数本身存储在字典里,而不是它们的返回值:
def keyboard(key):
values = {
110: discoMode,
27: exit
}
values.get(key, default)()
f()
是对函数 f
的调用,它会返回这个调用的结果。而 f
则是函数本身。
3
def keyboard(key):
values = {
110: discoMode(),
27: exit()
}
在这种情况下,你正在创建一个字典,这个字典里包含了“discoMode()”函数的返回值,赋值为110,还有“exit()”函数的返回值,赋值为27。
你本来想写的是:
def keyboard(key):
values = {
110: discoMode,
27: exit
}
这将把110赋值给函数discoMode(并不是调用这个函数!),exit也是一样。记住,函数是第一类对象:它们可以被赋值、存储,并且可以从其他变量中调用。