【问题标题】:Why is "if(x)" different from "if(x==True)" in Python?为什么“if(x)”与 Python 中的“if(x==True)”不同?
【发布时间】:2018-12-18 23:10:26
【问题描述】:

很抱歉,如果以前没有问过这个问题,因为这对任何接受过任何形式的 Python 培训的人来说都是显而易见的。我大部分时间都在用 Java 编程,我想知道我认为这是 Python 中的一个特质。我在胡闹

this=bool
if(this==True):this="big"
print(this)

毫不奇怪,我收到了一个泛型类型声明作为输出,因为如果为 True,那确实会很大。

<class 'bool'>

然后我使用我有限的 Java 理解来确定我可以进一步简化表达式,它是一个条件,对吗?这些是为布尔类型制作的。

this=bool
if(this):this="big"
print(this)

然后我差点笑出声来,但笑声中夹杂着恐惧

big

“this”比“this==True”“更少虚假”是有道理的,后者是大写 F 的 False,但我仍然认为它不应该评估为 True。此外,truthy 和 falsy 在其他情况下似乎足以产生预期的结果。那么是什么让一个空的布尔值变为真值呢?

我的第一个想法是它必须只是检查“this”是否存在。所以我删除了第一行的声明,期望找到“if([不存在的东西]):”会被跳过。相反,它抛出了一个错误。如果它存在的简单事实评估为 True,那么它的不存在不应该简单地评估为 False 吗?如果未初始化的值不返回 false,则初始化(空)值评估为 true 的功能有什么意义? 我以为我在阅读this answer 后理解了,实际上我的第一个想法是,“哦,它必须只是检查'this'是否存在。”然后我输入 if(this is not None):if(this!=None): 并再次得到“大”作为输出,表明“这个”无。

然后,我几乎惊慌失措地输入了

this=bool
if(this==None):this="big"
if(this==True):this="big"
if(this==False):this="big"
print(this)

你可能已经猜到了,失败了

<class 'bool'>

布尔值肯定是这“三个”之一?请不要告诉我我发现了“第四个”布尔值,我无法处理那种恶名。

问题(我认为)我遇到的所有问题是在第一行中删除“this”的初始化会导致错误,而不是 if 语句中的错误情况。如果在 x 存在时执行“if(x):”,那么不存在的“x”不应该通过并跳过该语句吗?为什么不保留 Java 中的布尔 if 功能,而只是强制我们检查 x 在这种情况下是否不为空?

【问题讨论】:

  • 但是,this=boolbool 分配给变量 this。所有类对象都是真实的。
  • 在 Java 中尝试使用 Object this = Boolean.class; 执行此操作,看看是否有 this.equals(true)。这相当于您在该代码中所做的。
  • “如果未初始化的值不返回 false,则初始化(空)值评估为 true 的功能有什么意义?”你从来没有测试过这个。您正在测试的值始终被初始化。如果不是,它将引发NameError(在全局范围内)或UnboundLocalError(在函数范围内),它们不会默默地评估为真或假。
  • 此外,Python 中没有未初始化的值

标签: python if-statement boolean


【解决方案1】:

bool 不是布尔值,它是一个类(就像intstr 等)。课程总是真实的。

我认为您的意思是写 this = bool()(与 this = False 相同 - 没有“空”布尔值之类的东西)。

【讨论】:

  • 所以它就像一个像布尔值这样的“包装器”类?
  • @reflektor 这不是一个包装器。 boolTrueFalse 的实例类。
【解决方案2】:

我不明白你在这里做什么。您正在使用 class 布尔值并检查它是否完全等于 True。好吧,当然不是,True 是 bool 的一个实例,一个类并不完全等于它的实例。它也不等于 False 或 None。但这并不能阻止它在布尔上下文中为真,因为它不是空的。

【讨论】:

    【解决方案3】:

    简单地说,一般情况下,你不能说if x 与Python 中的if x == True 具有相同的含义。它们的结果取决于x 的方法__bool____eq__ 分别是如何定义的。

    对于类本身,如boolint(即类型,不是该类的对象),__bool__ 被定义为始终返回True;而与True 的比较返回False

    因此:

    if int == True: print("NOT printed")
    if int: print("printed")
    if bool(int): print("printed") # equivalent to the previous one
    

    【讨论】:

    • 所以不是检查this是否存在,而是检查是否有bool这样的东西?
    • @reflektor 不,python 对象实现了一个__bool__ 方法,该方法确定bool(som_object) 将返回什么,这就是决定真实性的因素。此外,它还将检查 __len__ 是否返回 0,作为一种特殊情况,因此空容器被评估为虚假。
    【解决方案4】:

    bool 是一个内置类。您将this 分配给bool 类,使其永远不会等于True。当您键入 if(this) 时,this 将自动转换为布尔值,以便可以在 if 语句中对其进行评估。类总是转换为True 而不是False,这就是 if 语句执行的原因。

    【讨论】:

    • 所以 bool 和 Boolean 之间是有区别的......如果我理解正确的话,将 this(类对象)放在 if 语句中会强制将布尔类型强制转换为它?
    • @reflektor 不,它们是一回事。是的,将 this 放在 if 语句中会将其转换为 bool
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多