Python 列表推导中的“或”是啥意思? [复制]

Posted

技术标签:

【中文标题】Python 列表推导中的“或”是啥意思? [复制]【英文标题】:What does "or" mean inside a Python list comprehension? [duplicate]Python 列表推导中的“或”是什么意思? [复制] 【发布时间】:2021-04-30 20:23:25 【问题描述】:

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

actions.extend(self.get_action(action) for action in self.actions or [])

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

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

这是什么语法?

【问题讨论】:

or 不是生成器表达式的特殊语法。它可以帮助您在(self.actions or []) 周围放置括号,然后检查True or []False or [] 的结果。 【参考方案1】:

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

actions.extend(self.get_action(action) for action in (self.actions or []))

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

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

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

>>> a = None
>>> b = [1,2,3]
>>> c = a or b
>>> c 
[1,2,3]

这相当于:

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

if a:
     c = a
else:
     c = b

更多示例:

>>> 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

请注意,在最后一个示例中,我们可以将多个 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

【讨论】:

重申or 是一个“短路运算符”可能更有用,因此它在遇到第一个计算结果为“真”的操作数时停止计算其操作数,并且它总是返回最后计算的操作数的值,它可以是一个非布尔值。 @fountainhead 我用一个例子更新了我的答案。感谢您指出这一点! 我以前从未见过这种情况,但这是一个非常好的主意。谢谢!【参考方案2】:

本质上是这样说的:

if self.actions:
    for action in self.actions:
        actions.extend(self.get_action(action))
else: # For completeness, not actually necessary
    actions.extend([])

【讨论】:

以上是关于Python 列表推导中的“或”是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 中的 Python 列表、集合和映射推导等价物是啥?

如何使用列表推导来扩展 python 中的列表? [复制]

Python 方法签名中的 ->(破折号大于箭头符号)是啥意思? [复制]

python 列表推导

python中的'%%'是啥意思? [复制]

Python 中的 @withparser 方法是啥意思? [复制]