Python 列表推导式中的“或”是什么意思?

Dar*_*rks 2 python

我在 Django 源代码中找到了以下行:

actions.extend(self.get_action(action) for action in self.actions or [])
Run Code Online (Sandbox Code Playgroud)

参数self.get_action(action) for action in self.actions or []必须是可迭代值的推导式,但我无法弄清楚该or []片段可能意味着什么。

没有if,所以or没有在布尔表达式中使用,这是我认为我在 Python 中熟悉的唯一用法。Web 搜索只返回布尔值or.

这是什么语法?

fla*_*kes 6

也许这会让你更容易看到:

actions.extend(self.get_action(action) for action in (self.actions or []))
Run Code Online (Sandbox Code Playgroud)

的值self.actions可能是None,即它的类型是Optional[List[T]]

使用or运算符将返回第一个评估为真的值,或返回它评估的最后一个值。这使用短路逻辑,这意味着如果您将多个值链接在一起,一旦找到第一个“真实”值,它将停止评估表达式(参见底部示例)。

对于基本语义,请考虑以下示例:

>>> a = None
>>> b = [1,2,3]
>>> c = a or b
>>> c 
[1,2,3]
Run Code Online (Sandbox Code Playgroud)

这相当于:

a = None
b = [1,2,3]

if a:
     c = a
else:
     c = b
Run Code Online (Sandbox Code Playgroud)

还有一些例子:

>>> a = 1
>>> b = 2
>>> a or b
1

>>> a = 1
>>> b = None
>>> a or b
1

>>> a = None
>>> b = 2
>>> a or b
2

>>> a = None
>>> b = None
>>> a or b
None

>>> a = None
>>> b = False
>>> a or b
False

>>> a = 0
>>> b = 0
>>> c = 1
>>> a or b or c
1
Run Code Online (Sandbox Code Playgroud)

请注意,在最后一个示例中,我们能够将多个or调用链接在一起!

短路的一个例子(注意foo(2)没有被调用!):

>>> def foo(i):
...    print(f"foo: {i}")
...    return i
...
>>> foo(0) or foo(1) or foo(2)
foo: 0
foo: 1
1
Run Code Online (Sandbox Code Playgroud)

  • 重申“or”是一个“短路运算符”可能更有用,因此它在遇到第一个计算结果为“true”的操作数时停止计算其操作数,并且它始终返回最后计算的操作数的值,这可能是一个非布尔值。 (2认同)