Python布尔值 - 如果x:,则vs x == True,vs,如果x为True

时间:2013-12-06 09:55:57

标签: python if-statement boolean

如果之前有人问过这个问题,我会道歉,但是我徒劳地搜索了完全问题的答案。基本上,使用Python 2.7,我有一个运行一系列地理处理工具的程序,取决于用户在脚本中调整的一系列True / False变量所需的内容,例如。

x = True

if x:
    run function

但是,我现在发现x不需要字面上“True”来运行该函数。例如:

In: x = True
    if x:
        print True

Out: True

In: x = 123
    if x:
        print True

Out: True

In: x = 'False'
    if x:
        print True

Out: True

In: x = False
    if x:
        print True

Out: 

因此,除False以外的任何值似乎都会计算为True,如果 x == True x为True 则不会出现这种情况。看作PEP 8强烈建议仅使用 if x:变体,有人可以解释为什么会出现这种情况吗?似乎如果x:更像是“如果x不是假”或“如果x存在”的测试。考虑到这一点,我相信如果x为True,我应该使用:在这种情况下,尽管PEP 8必须说。

亲切的问候

8 个答案:

答案 0 :(得分:26)

if和其他逻辑上下文的上下文中,Python中的以下值为false:

  • False
  • None
  • 数字值等于0,例如00.0-0.0
  • 空字符串:''u''
  • 空容器(例如列表,元组和字典)
  • 任何实现__bool__(在Python3中)返回False__nonzero__(在Python2中)返回False0的任何内容。
  • 任何未实现__bool__(在Python3中)或__nonzero__(在Python2中),但实现__len__以返回等于0的值

如果任何一个对象适用,则该对象被视为“假”,否则被视为“真”,无论它是否与FalseTrue实际上相同或相同

现在,如果您已安排x必然是对象TrueFalse之一,那么您可以安全地编写if x。如果您已经安排x的“真实性”表明是否执行操作,无论类型如何,那么您可以安全地编写if x。你可以写下你应该这样做的地方,因为阅读更清晰。

通常情况下,如果允许x获取值True,则您处于这两种情况之一,因此您不会写if x is True。重要的是要正确记录x的含义,以便它反映代码中使用的测试。

Python程序员应该知道什么被认为是真的,所以如果你只是记录,“如果x为真,则运行函数”,然后表示原始代码的作用。记录它,“运行函数,如果x is True”具有不同的含义,并且不太常用,因为PEP8中的样式规则要求测试真实性而不是特定值True

但是,如果您希望代码在x是空容器None的情况下表现不同,那么您可以编写类似if x is not None的内容。

答案 1 :(得分:3)

x = 'False'
x = 123

两者都是True

Other truth values.

该文件解释了其他价值观。

就PEP8的原因而言,它的语义要远远超过if this_file_is_green

答案 2 :(得分:1)

其他虚假值包括0''[]。您应该使用if x:版本。

答案 3 :(得分:1)

不言而喻,您应该编写满足您需求的代码。但在大多数情况下,您根本不需要说== Trueis True,因为您不需要将True与其他“真实”值区分开来。因此,为了简单起见,建议不要这样做。

您绝对应该使用== Trueis True的情况是 需要将True与其他真实值区分开来。

在您的示例中,您是否关心True123之间的区别?这会告诉你编码的方式。

关于编码== Trueis True的一件事:当其他开发人员阅读您的代码时,它会引发一个小红旗。他们不会认为这是错的,他们只会想知道为什么会这样,并且想要知道为什么在这种特殊情况下将True与其他真实价值观区别对待是很重要的。

换句话说,如果你不需要它,最好不要使用它。

答案 4 :(得分:1)

我想添加一个简短的示例,其中 3 个测试不同:

def test(x):
    print(x, ":", bool(x), x == True, x is True)

test("something")
test(1)
test(True)

输出(格式很好):

# "something" : True False False
#           1 : True True  False
#        True : True True  True

答案 5 :(得分:0)

说出

的能力
if x:
   ...

被视为一项功能。您还可以指定何时应该考虑对用户定义的类传递测试(只需在Python 2.x中定义方法__nonzero__或在Python 3中定义__bool__)。

例如,对于字符串和容器(如列表,词典或集合),测试if x ...表示“如果x不为空”。

请注意,其基本原理并不是允许编写更少的代码,而是生成的代码更易于阅读和理解。

如果您愿意改写if x is True ...,您是否考虑过更进一步走向if (x is True) is True ...if ((x is True) is True) is True ...的路径? : - )

答案 6 :(得分:0)

在Python 2.7中,if a:if a==True对于不同于1的值没有给出相同的输出。以下是一些代码片段,用于演示不同的行为:

a=1

a=1
if a==True: 
    print (a,"True")
else:
    print (a,"Not True")

output> (1,True)
a=1
if a: 
    print (a,"True")
else:
    print (a,"Not True")

output> (1, True)

a=2

a=2
if a: 
    print (a,"True")
else:
    print (a,"Not True")

output> (2, True)
a=2
if a==True: 
    print (a,"True")
else:
    print (a,"Not True")

output> (2, Not True)

答案 7 :(得分:0)

如果你使用 if x ,这意味着它必须评估 x 的真值。但是当你使用 x ==Truex is True 时,它意味着检查 type(x)== bool 以及 x 是否为 True。

注意x is True不等于bool(x)==True

当您使用 x is True 时,您正在检查 x 和 True 的 id。