什么是真实和虚假?它与对与错有什么不同?


118

我刚刚才知道有TruthyFalsy值在Python这是从正常的不同TrueFalse

有人可以深入解释什么是真实虚假的价值观吗?

我应该在哪里使用它们?

是什么区别truthyTrue值和falsyFalse价值观?


20
如果bool(value)导致True,那value就是事实
wnnmaw

4
您是自己发明这些单词的,不是吗?无论如何,看到__nonzero____bool__
zvone

6
在需要某种二进制测试的情况下,“真/假”值只是方便。它允许使用更简单的代码,并且更简单的代码通常更易于阅读,而出现错误的机会则更少。
Mark Ransom

4
如果编程语言没有布尔值,则@zvone Truthy和falsy通常在代码高尔夫球中使用。
MilkyWay90

6
@zvone:比较编程语言(例如PHP,PERL,Python,JS)时,广泛使用“ Truthy”和“ falsy”。(绝对不只是编码高尔夫)。
smci

Answers:


77

如评论所述,它仅指评估为True或False的值。

例如,查看列表是否不为空,而不是像这样检查:

if len(my_list) != 0:
   print("Not empty!")

您可以简单地做到这一点:

if my_list:
   print("Not empty!")

这是因为在评估布尔值时,某些值(例如空列表)被视为False。非空列表为True。

类似地,对于整数0,对于False,空字符串“”,依此类推;对于True,对于非零整数,非空字符串,依此类推。

像“真实的”和“虚假的”这样的术语的概念仅指那些在上述情况下被认为是True的值,以及被认为是False的那些值。

例如,一个空列表([])被视为“虚假”,而一个非空列表(例如[1])被视为“真实”。

另请参阅本节


还是说my_list为true?

我建议在Python shell中尝试这些东西,然后自己看看。;)if my_list表示“如果my_list不为空”,if not my_list表示“如果my_list为空”。
B. Eckles

1
好吧,我最后一点困惑,我已经看到很多地方,例如if a:这种情况意味着什么?是a是真还是a是假?或者这意味着a是真实的还是a虚假的?

1
意思是“如果a为真”。正如我在回答中所描述的那样,以及其他人在评论和其他答案中所描述的那样,认为不同的事物是对还是错,但实际上并非如此。例如,一个空列表被认为是False。这就是为什么if []:永远不会执行的原因。
B. Eckles

表示a:表示a是否为真(当a为整数或字符串时),如果a:表示false;如果a为空列表或空dict或false值!

199

除以下值“ fassy”外,所有值均被视为“真实”值:

  • None
  • False
  • 0
  • 0.0
  • 0j
  • Decimal(0)
  • Fraction(0, 1)
  • [] -一个空的 list
  • {} -一个空的 dict
  • () -一个空的 tuple
  • '' -一个空的 str
  • b'' -一个空的 bytes
  • set() -一个空的 set
  • 一个空的range,像range(0)
  • 为其对象
    • obj.__bool__() 退货 False
    • obj.__len__() 退货 0

“真实的”值将满足ifwhile语句执行的检查。我们使用“真实的”和“虚假的”来区别boolTrueFalse

真值测试


5
很棒的清单,谢谢。完全是学术问题,但是您知道执行顺序是什么吗?认为您可以创建一个对象,其中bool返回True,len返回0(反之亦然)。
Hayden Crocker

16
@HaydenCrocker首先查找__bool__,然后查找__len__。如果两者均未定义,则所有实例均视为“ true”。object.__bool__方法的文档中对此进行了讨论
Patrick Haugh

3
在3.5之前的Python版本中,表示午夜UTC的时间对象被视为False。本文概述了有关该问题的错误报告以及最终的解决方案。
Jason V.

1
有趣的是,对于datetime包,datetime.min是真实的,而timedelta(0)是虚假的。
大卫·金霍恩

1
@DavidKinghorn这是有道理的,对吗?最小datetime值只是一个与其他日期一样的日期,无论如何都不是零。相比之下,timedelta(0)就像零。当发现表示午夜的时间值是虚假的时就提出来了,这个问题最终得到了解决:lwn.net/Articles/590299
Patrick Haugh

5

真实值是指布尔上下文中使用的对象,而不是返回true或false的布尔值,以这些为例:

>>> bool([])
False
>>> bool([1])
True
>>> bool('')
False
>>> bool('hello')
True

4

Python通过应用bool()类型来确定真实性,该类型返回TrueFalse在诸如if或的表达式中使用while

这是一个自定义类Vector2d的示例,False当大小(向量的长度)为0时返回该实例,否则为True

import math
class Vector2d(object):
    def __init__(self, x, y):
        self.x = float(x)
        self.y = float(y)

    def __abs__(self):
        return math.hypot(self.x, self.y)

    def __bool__(self):
        return bool(abs(self))

a = Vector2d(0,0)
print(bool(a))        #False
b = Vector2d(10,0)    
print(bool(b))        #True

注意:如果没有定义__bool__,它将始终返回True,因为默认情况下,用户定义类的实例被认为是真实的。

书中的示例:“精通Python,清晰,简洁,有效的编程”


2

您应该在哪里使用Truthy或Falsy值?这些是语法糖,因此您始终可以避免使用它们,但是使用它们可以使您的代码更具可读性并提高效率。此外,无论是否在python中,您都会在许多代码示例中找到它们,因为这被认为是一种好习惯。

如其他答案所述,您可以在if测试和while循环中使用它们。下面是在Python 3另外两个例子与组合的默认值ors作为一个字符串变量。您还将扩展到类似情况。

没有真理

if len(s) > 0:
    print(s)
else:
    print('Default value')

说实话,它更简洁:

print(s or 'Default value')

在python 3.8中,我们可以利用赋值表达式 :=

没有真理

if len(s) == 0:
    s = 'Default value'
do_something(s)

说实话,它也更短

s or (s := 'Default value')
do_something(s)

甚至更短

do_something(s or (s := 'Default value'))

没有赋值表达式,一个人可以做

s = s or 'Default value'
do_something(s)

但不短。有些人认为这s =...条线不令人满意,因为它对应于

if len(s)>0:
    s = s # HERE is an extra useless assignment
else:
    s = "Default value"

但是,如果您愿意的话,可以遵循这种编码风格。


-1
while 0:
    print("Inside the loop.", counter)
    counter -= 1
print("Outside the loop.", counter)

如果运行此循环,您将看到while 0:= while false:

0被认为是虚假的


-2

Falsy表示空值,如空列表,元组,如任何具有空值或无的数据类型。真实的手段:除了真实

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.