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 列表、集合和映射推导等价物是啥?