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

ssa*_*ast 24 python if-statement boolean

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

x = True

if x:
    run function
Run Code Online (Sandbox Code Playgroud)

但是,我现在发现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: 
Run Code Online (Sandbox Code Playgroud)

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

亲切的问候

Ste*_*sop 30

Python中的以下值在if其他逻辑上下文中是错误的:

  • False
  • None
  • 数值等于0,如0,0.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是真的",那么表示原始代码的作用.记录它,"运行函数if x is True"将具有不同的含义,并且由于PEP8中的样式规则要求测试真实性而不是特定值,因此不太常用True.

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


VPf*_*PfB 5

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

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

test("something")
test(1)
test(True)
Run Code Online (Sandbox Code Playgroud)

输出(格式很好):

# "something" : True False False
#           1 : True True  False
#        True : True True  True
Run Code Online (Sandbox Code Playgroud)