以下条件给出相同的结果。它们之间是否有任何表现(或任何其他)差异?
1
if (x != None) and (y != None):
# Proceed
2
if (x and y) is not None:
# Proceed
答案 0 :(得分:9)
In [44]: x = False
In [45]: y = None
In [46]: (x != None) and (y != None)
Out[46]: False
In [47]: (x and y) is not None
Out[47]: True
顺便说一下,当测试某些东西是否时,最好测试
if x is None
而不是
if x == None
结果可能不同:
class Egalitarian(object):
def __eq__(self, other):
return True
x = Egalitarian()
print(x == None)
# True
print(x is None)
# False
答案 1 :(得分:5)
在日常使用中使用布尔构造时,我们倾向于跳过公共部分,以便X(Y) @ X(Z)
变为X @ (Y,Z)
:
Her bunny is happy and her hamster is happy (1)
与
相同Her bunny and her hamster are happy
然而,在编程中,我们不能承包这样的东西。第一个陈述
bunny == happy and hamster == happy
如果两只宠物都没事,那么将是真的。第二个短语从字面上翻译成:
(bunny and hamster) == happy
此处,(bunny and hamster)
评估为
- a falsy value, if she's got no bunny
- the hamster otherwise
所以(bunny and hamster) == happy
实际上读为:
She's got a bunny and her hamster is happy
与声明(1)
完全不同在python中:
>>> happy = 1
>>> sad = 2
>>> bunny = sad
>>> hamster = happy
>>> bunny == happy and hamster == happy
False
>>> (bunny and hamster) == happy
True
>>>
答案 2 :(得分:4)
您需要了解您正在做什么才能理解真正的差异,您可能会认为以下是一个简单的陈述:
>>> if (x and y) is not None:
这不是一个简单的条件陈述。在这里,您首先评估(x and y)
将返回找到的最后一个 Truthy 值,或者它找到的第一个 Falsey 值,然后将其与{{进行比较1}}。哪个会产生意想不到的结果。 (咨询The Peculiar Nature of and
and or
)
如果您想检查以确保 is not None
和x
都不是y
,您应该执行以下操作:
None
几乎与:
相同>>> if all(var is not None for var in [x, y]):
只是更容易阅读,更健壮(如果你要添加更多变量来检查),
无论哪种方式,你的两个陈述之间的区别在于第一个陈述实际上会按预期执行,但应使用>>> if x is not None and y is not None:
代替is not
来到!=
。第二种说法有时可能会起作用,但正在做一些你可能没想到的事情。
答案 3 :(得分:0)
一般
if x and y:
#Proceed
在Python世界中已经足够了。
这里我说的很好,因为在大多数情况下,函数不应该返回False和None,而它们在函数逻辑中具有不同的含义。
对于那些贬低者,你会认真地在现实世界中写下以下代码吗?
if x is None:
#xxx
elif x == False:
#xxxx
else:
#xxx
我只是想指出,这两个例子都不是pythonic,应该避免。
答案 4 :(得分:0)
“是”和“不是”,因为它们检查身份(即比较指针/引用)
其他比较和逻辑运算符将检查对象的值(或真实性)。
一般来说,要检查“无”值,您需要使用“是”/“不是”。
就我个人而言,我发现依赖于表达式中None值的行为是不好的形式(通常会触发NullPointerException或许多其他语言中的类似错误),所以虽然我不完全确定你在尝试什么实现,我写的一般类似的代码看起来像:
if x is not None and y is not None: