Python将字典中存储的函数直接赋值给变量后调用不生效问题排查
Python计算器字典存储运算函数的两种写法差异原因
两种写法的本质差异是混淆了函数对象本身和函数调用后返回的运算结果两个完全不同的概念。
代码对比示例
公共前置代码
# 四则运算函数定义 def add(n1, n2): return n1 + n2 def sub(n1, n2): return n1 - n2 def mul(n1, n2): return n1 * n2 def div(n1, n2): return n1 / n2 # 存储运算函数的字典 op_dict = { "+": add, "-": sub, "*": mul, "/": div } # 测试参数 num1 = 10 num2 = 2 selected_op = "+"
第一种错误写法的典型形态
# 错误写法 answer = op_dict[selected_op] # 这里仅把函数对象本身赋值给了answer,answer此时是函数,不是运算结果 answer(num1, num2) # 调用了函数但没有接收返回值,返回的运算结果直接被丢弃 print(answer) # 打印的是函数对象本身,输出类似 <function add at 0x7f8b2c0a71f0>,并非运算结果
第二种正确写法的典型形态
# 正确写法 operation_function = op_dict[selected_op] # 先取出函数对象存储 answer = operation_function(num1, num2) # 调用函数,把执行后返回的运算结果赋值给answer,此时answer是数值类型 print(answer) # 输出 12,符合预期
本质差异说明
- 从字典中取出的
op_dict[selected_op]是函数对象,本质是可执行的代码块,本身不存储运算结果,只有加括号传入参数调用它,才会执行内部逻辑并返回运算结果 - 你可以通过打印变量类型验证差异:
print(type(op_dict["+"]))输出<class 'function'>,代表是函数对象print(type(op_dict["+"](num1, num2)))输出<class 'int'>,代表是运算后的数值结果
通俗类比
你可以把函数理解成榨汁机:
- 函数对象本身就是榨汁机,只能用来执行榨汁操作,本身不能当果汁喝
- 调用函数(加括号传参数)就是把水果放进榨汁机启动,得到的果汁就是函数返回的运算结果
第一种写法相当于你直接把榨汁机当成果汁打印,第二种写法是你用榨汁机榨出果汁后打印果汁,自然结果不同。
内容的提问来源于stack exchange,提问作者Pratik Thorat
相关产品推荐
相关产品推荐

