这两个 python 语句是否相同?

Are these two python statements the same?

我有这两个说法

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

return self.getData() or ''

我想知道它们是相同的还是有什么不同

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

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

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

然后是:

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

在逻辑上等同于:

x = f() or ""

因为 f() 在这两种情况下都被视为布尔表达式,并且 f() 将计算为 True(ish) 或 False(ly) 两个表达式的值会 return 相同的结果。

这叫做Logical Equivalence

In logic, statements p and q are logically equivalent if they have the same logical content. This is a semantic concept; two statements are equivalent if they have the same truth value in every model (Mendelson 1979:56). The logical equivalence of p and q is sometimes expressed as p \equiv q, Epq, or p \Leftrightarrow q. However, these symbols are also used for material equivalence; the proper interpretation depends on the context. Logical equivalence is different from material equivalence, although the two concepts are closely related.

我会说不,因为如果 self.getData() 在其操作期间更改某些内容,那么第一个语句有可能返回不同的结果,因为它将对其进行第二次调用。

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

另一个选项将只对函数求值一次,将其用作布尔检查和返回。

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

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

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

将运行函数getData两次,而

2) return self.getData() or ''

只会运行一次。如果 getData() 需要一段时间才能执行,这可能很重要,这意味着 1) 不是 与 2) 如果函数 getData() 有任何一边效果。

坚持使用 2).