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

use*_*546 19 python operators

我有这两个陈述

return self.getData() if self.getData() else ''
Run Code Online (Sandbox Code Playgroud)

return self.getData() or ''
Run Code Online (Sandbox Code Playgroud)

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

mik*_*e.k 32

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

  • 啊; 这就是所谓的"副作用":) (3认同)

Jam*_*lls 22

也许吧,但前提self.getData()是它只是一个纯粹的功能而且没有任何副作用.更重要的是,self.getData()返回的对象也必须没有任何副作用并始终返回布尔值.

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

def f():
    return ["Hello World!"]
Run Code Online (Sandbox Code Playgroud)

然后是以下内容:

x = f() if f() else ""
Run Code Online (Sandbox Code Playgroud)

在逻辑上等同于:

x = f() or ""
Run Code Online (Sandbox Code Playgroud)

因为f()在两种情况下都被视为布尔表达式,并且f()将评估为True(ish)或False(ly)值,两个表达式将返回相同的结果.

这称为逻辑等价

在逻辑中,如果语句p和q具有相同的逻辑内容,则它们在逻辑上是等效的.这是一个语义概念; 如果两个陈述在每个模型中具有相同的真值,则它们是等价的(Mendelson 1979:56).p和q的逻辑等价有时表示为p\equiv q,Epq或p\Leftrightarrow q.但是,这些符号也用于材料等价; 正确的解释取决于具体情况.逻辑等价与物质等价不同,尽管这两个概念密切相关.

  • 挑剔:实际上你需要一个更强的前提条件,你所列出的那个.返回值的`__bool__`方法也必须是纯方法.`getData`函数可能返回*相同的对象*但是这个对象第一次表现为真值,第二次表现为假值,独立于`getData`内的操作(​​它甚至可能只是:`返回X`). (2认同)
  • 更多挑剔:访问`getData`属性也必须没有副作用. (2认同)

Eli*_*ICA 8

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

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

将运行该函数getData两次,而

2) return self.getData() or ''

只运行一次.如果这可能是重要getData()需要一段时间来执行,并且它意味着1)是一样的2)如果该函数getData()具有任何副作用.

坚持2).


小智 7

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

另一个选项将仅对该函数进行一次评估,将其用作布尔检查和返回.

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