Python: 使用字典作为开关不工作

6 投票
3 回答
693 浏览
提问于 2025-04-16 11:35

我刚开始学习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也是一样。记住,函数是第一类对象:它们可以被赋值、存储,并且可以从其他变量中调用。

撰写回答