我对python编程语言还是比较陌生的,我希望能更多地理解dict理解是如何工作的(如果这实际上是它首先是什么!)< / p>
return {
'hello': method_call_1()
'goodbye': method_call_2()
'hello2': method_call_3()
}['hello']
考虑到这一点,我认为method_call_1()
将被执行,因为它是返回所寻找的字典键。然而,在我的程序中,似乎执行了其他两个方法(或者由于缺少它们而存在错误),无论它们是否被返回。
这是标准行为吗?我唯一的假设是python编译器会在它们实际使用之前预先执行方法调用,而不是只执行所选的方法。
在我的头顶上,我可能会用以下内容解决这个问题:
x = return {
'hello': 'method_call_1'
'goodbye': 'method_call_2'
'hello2': 'method_call_3'
}['hello']
x()
但这似乎是不合适的做法,有没有更好的方法来解决这个问题?
答案 0 :(得分:2)
生成dict时,Python希望存储每个表达式的结果值,因此在dict中调用的每个函数都将在生成过程中进行评估,而不是在调用过程中进行评估。
如果您只是在那里存储函数以便稍后调用它们,则可以存储函数的内存地址。也就是说,没有括号的函数的名称。
这样你可以稍后调用它们,就像你在第二个代码块中尝试的那样:
x = return {
'hello': method_call_1,
'goodbye': method_call_2,
'hello2': method_call_3,
}['hello']
x()
答案 1 :(得分:0)
python编译器实际上是在尝试执行这些方法,因为你正在调用它们(()
),所以这个函数的返回值被赋值给dict的值。
你可以这样做:
def func_1():
return 1
def func_2():
return func_1
def func_3():
return func_1()
def select_funct(i):
selection = {1: func_1,
2: func_2,
3: func_3(),
}
return selection[i]
print(select_funct(1)())
print(select_funct(2)()())
print(select_funct(3))