if-else python short-cut评估函数两次吗?

sas*_*llo 0 python nonetype

假设我有一个getQ(x)返回一些数字的函数,它很慢.现在,如果我这样做:

x = 10
x = getQ(x) if getQ(x) >= 0 else 0
Run Code Online (Sandbox Code Playgroud)

getQ在这种情况下得到执行两次?

这是:

x = getQ(x)
x = x if x >= 0 else 0
Run Code Online (Sandbox Code Playgroud)

更快?

如果是这样,对于这种情况,是否有更优雅的单线程?

Ism*_*awi 5

是的,getQ如果结果是非负的话会被调用两次,所以第二种情况肯定会更快.

在这种特殊情况下,你可以写x = max(getQ(x), 0).您正在寻找的"通用"解决方案就像

x = (lambda x: x if x >= 0 else 0)(getQ(x))
Run Code Online (Sandbox Code Playgroud)

我不建议在实际代码中使用它,但它允许您绑定一个名称,同时仍然保持一个表达式.