Python字典理解预执行方法

时间:2017-10-13 11:20:35

标签: python dictionary

我对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()

但这似乎是不合适的做法,有没有更好的方法来解决这个问题?

2 个答案:

答案 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))