这两个python语句是一样的吗?

时间:2015-06-09 01:18:14

标签: python operators

我有这两个陈述

return self.getData() if self.getData() else ''

return self.getData() or ''

我想知道它们是相同的还是有任何区别

4 个答案:

答案 0 :(得分:32)

我会说不,因为如果self.getData()在操作期间发生了某些变化,那么第一个语句就有可能返回不同的结果,因为它会进行第二次调用。

答案 1 :(得分:22)

可能,但仅当self.getData()是纯函数且没有副作用时。更重要的是,self.getData()返回的对象也必须没有任何副作用,并且始终返回一个布尔值。

在最简单的情况下,f()定义为:

def f():
    return ["Hello World!"]

然后是以下内容:

x = f() if f() else ""

在逻辑上等同于:

x = f() or ""

由于f()在两种情况下都被视为布尔表达式,f()将评估为True(ish)或False(ly)值,两个表达式都将返回同样的结果。

这称为Logical Equivalence

  

在逻辑中,语句p和q在逻辑上是等价的,如果他们有   相同的逻辑内容。这是一个语义概念;两个陈述是   等价,如果他们在每个模型中具有相同的真值(门德尔森   1979:56)。 p和q的逻辑等价有时表示为   p \ equiv q,Epq或p \ Leftrightarrow q。但是,这些符号是   也用于物质对等;正确的解释取决于   在上下文中。逻辑等价与材料不同   等价,虽然这两个概念密切相关。

答案 2 :(得分:8)

它们将具有相同的结果,因为两者都将self.getData()的结果视为布尔上下文,但要注意:

1) return self.getData() if self.getData() else ''

将运行函数getData两次,而

2) return self.getData() or ''

只运行一次。如果getData()需要一段时间才能执行,这可能很重要,这意味着1)如果函数getData()有任何副作用,则与2)相同。 / p>

坚持2)。

答案 3 :(得分:7)

我看到的唯一区别是第一个将调用self.getData()两次,第一个用于评估布尔值,第二个可以返回(如果第一个被评估为True)。

另一个选项只会对函数进行一次评估,并将其用作布尔检查和返回。

例如,如果self.getData()在返回数据后删除或修改数据或者函数需要很长时间来计算,那么这一点至关重要。