如果之前有人问过这个问题,我会道歉,但是我徒劳地搜索了完全问题的答案。基本上,使用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必须说。
亲切的问候
答案 0 :(得分:26)
在if
和其他逻辑上下文的上下文中,Python中的以下值为false:
False
None
0
,0.0
,-0.0
''
和u''
__bool__
(在Python3中)返回False
或__nonzero__
(在Python2中)返回False
或0
的任何内容。__bool__
(在Python3中)或__nonzero__
(在Python2中),但实现__len__
以返回等于0的值如果任何一个对象适用,则该对象被视为“假”,否则被视为“真”,无论它是否与False
或True
实际上相同或相同
现在,如果您已安排x
必然是对象True
或False
之一,那么您可以安全地编写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
该文件解释了其他价值观。
就PEP8的原因而言,它的语义要远远超过if this_file_is_green
答案 2 :(得分:1)
其他虚假值包括0
,''
,[]
。您应该使用if x:
版本。
答案 3 :(得分:1)
不言而喻,您应该编写满足您需求的代码。但在大多数情况下,您根本不需要说== True
或is True
,因为您不需要将True
与其他“真实”值区分开来。因此,为了简单起见,建议不要这样做。
您绝对应该使用== True
或is True
的情况是 需要将True
与其他真实值区分开来。
在您的示例中,您是否关心True
和123
之间的区别?这会告诉你编码的方式。
关于编码== True
或is 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 ==True
或 x is True
时,它意味着检查 type(x)== bool 以及 x 是否为 True。
注意:x is True
不等于bool(x)==True
当您使用 x is True
时,您正在检查 x 和 True 的 id。