python之间的差异(x不是None)和(y不是None)和(x和y)不是None

时间:2013-10-16 09:46:23

标签: python

以下条件给出相同的结果。它们之间是否有任何表现(或任何其他)差异?

1

if (x != None) and (y != None):
    # Proceed

2

if (x and y) is not None:
    # Proceed

5 个答案:

答案 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 Nonex都不是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: