【问题标题】:Why does 'x or y' not return a Boolean value? [duplicate]为什么“x 或 y”不返回布尔值? [复制]
【发布时间】:2021-04-30 18:18:33
【问题描述】:

最近我在 Python 中偶然发现了一个 interesting piece of code

condition and 'string1' or 'string2'

我花了一些时间弄清楚它的含义,但最后它是另一种写三元表达式的方式

'string1' if condition else 'string2'

这让我意识到x or y 不会返回 True 或 False,但如果 x 为 True,则返回 x,否则返回 y (Python Docs)。

但是,我不明白 Python 之所以这样设计的原因。我见过一些检查无的用例

y = None
x = y or default

但这可以使用以下方法更轻松、更清晰地实现

x = y if y else default

运行时方面我也看不到好处,因为如果 x 为 False,则需要在某个时候评估 x or y 中的第二项。

就代码可读性而言,我希望bool_test = x or y 包含一个布尔值。

那么总的来说,为什么 Python 是这样设计的?

【问题讨论】:

  • y is None 实际上只对显式有用。否则,if y: 就足够了。如果你想要一个布尔值,请使用bool()
  • 这确实是个人(即 Guido van Rossum 的)意见问题。
  • 曾有一段时间(2.5 之前)三元运算符a = b if c else d 不可用。像x = y or z 这样的速记作为替代。现在很难为这种旧方法找到一个好的理由。
  • @JamieDeith 当时也没有真正的理由。在没有实际条件表达式的情况下,这只是一个大多数但不完全正确的习语。
  • 部分你的任务是关于布尔表达式短路 - 例如。 if x() or y(): 如果x() 返回真实的值,那么表达式的其余部分将不会被计算,即y() 不会被调用。同样对于if x() and y():,如果x() 是假的,那么y() 将不会被评估,因为没有意义。

标签: python


【解决方案1】:

严格来说,您是对的,当我们谈论逻辑运算符 - andor 时,它应该返回一个布尔值 - 特别是如果您来自严格类型的语言。

问题是,动态类型(通常是脚本语言)往往具有广泛的真实性,也就是评估表达式的值是 TRUE 还是 FALSE。一个很好的例子是,在 MOST 语言中,评估为零,也就是 0FALSE,并且通常以这种方式暗示。

就是这样 - 在 Python 中 - 有很多东西可以计算为 FALSE,而不仅仅是一个整数值 0。空列表、空字典等通常被暗示为 falsy 如果你这样做 if [] -> 它与 if len(my_array)==0 相同,你的数组/列表长度为 0 并最终给你一个不错的布尔值False

可以看一下python的真值表here

Value Truthiness
True ✅ TRUE
False ❌ FALSE
1 ✅ TRUE
0 ❌ FALSE
-1 ✅ TRUE
"True" ✅ TRUE
"False" ✅ TRUE
"1" ✅ TRUE
"0" ✅ TRUE
"-1" ✅ TRUE
"" ❌ FALSE
None ❌ FALSE
inf ✅ TRUE
-inf ✅ TRUE
[] ❌ FALSE
{} ❌ FALSE
[[]] ✅ TRUE
[0] ✅ TRUE
[1] ✅ TRUE

可读性 - 我认为它是主观的。 x = y or default 肯定比说的要短,你懂的:

x = y if y is not None else default

因为如果暗示None 将永远是False,并且除非你有非常充分的理由来争论为什么None 不应该是falsy,那么为什么要这样做我懒得写if y is not None? (只需将其评估为 False,在or 比较器中跳过它,然后给我default,快速缩放~

有些人追求简洁的代码,他们声称它是可读的。有些人喜欢清晰、肯定的语法,比如冗长的语法,并声称它是可读的。所以我想这就是你选择营地的地方:)

【讨论】:

  • Err,你能解释一下为什么0 在表格中同时有 TRUE 和 FALSE 吗?知道为什么 1 和 -1 出现两次吗?
  • @barny 那不是一张漂亮的桌子,它被打印出来了。我只是从链接中获取的。第二个0 应该是"0" 也就是零字符串,正如您从文章中看到的那样
  • 是的,代码确实显示了差异。 TBH,您最好链接到更清晰/更精确的内容 - 至少权威来源是 Python 文档,例如docs.python.org/3.8/reference/…
  • 我不介意你使用的词,但我认为你需要一个更好的参考和表格,不会混淆事物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 2015-02-19
  • 1970-01-01
相关资源
最近更新 更多