0

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

1.

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

2.

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

5 回答 5

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

顺便说一句,当测试某事是否为 None 时,最好测试一下

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
于 2013-10-16T09:50:10.990 回答
6

一个程序员的老婆问他:早餐要香肠还是培根?- 是的,他回应了。(一个真实的故事)。

在日常生活中使用布尔构造时,我们倾向于跳过公共部分,这样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)完全不同

在蟒蛇中:

>>> happy = 1
>>> sad = 2
>>> bunny = sad
>>> hamster = happy
>>> bunny == happy and hamster == happy
False
>>> (bunny and hamster) == happy
True
>>> 
于 2013-10-16T10:25:10.547 回答
4

您需要了解您正在做什么才能了解​​真正的差异,您可能会认为以下是一个简单的陈述:

>>> if (x and y) is not None:

这不是一个简单的条件语句。在这里,您首先评估(x and y)哪个将返回它找到的最后一个Truthy值,或者它找到的第一个Falsey值,然后将其与is not None. 这有时会产生意想不到的结果。(请参阅的特殊性质andor

如果您想检查以确保两者 都不是x,您应该执行以下操作:yNone

>>> if all(var is not None for var in [x, y]):

这几乎与以下内容相同:

>>> if x is not None and y is not None:

只是更容易阅读,更健壮(如果您添加更多变量进行检查),


无论哪种方式,您的两个语句之间的区别在于第一个语句实际上会执行您期望的操作,但是您应该使用is not而不是!=何时使用None. 第二个语句有时可能会起作用,但正在做一些你可能没有预料到的事情。

于 2013-10-16T09:53:51.380 回答
0

通常

if x and y:
    #Proceed

在 Python 世界中已经足够好了。

在这里我说得很好,因为在大多数情况下,一个函数不应该返回 False 和 None,而它们在函数逻辑中具有不同的含义。

对于那些不赞成投票的人,你真的会在现实世界中编写以下代码吗?

if x is None:
    #xxx
elif x == False:
    #xxxx
else:
    #xxx

我只想指出,这两个例子都不是 Python 的,应该避免。

于 2013-10-16T09:51:38.727 回答
0

“is”和“is not”在检查身份时很快(即比较指针/引用)

其他比较和逻辑运算符将检查对象的值(或真实性)。

通常要检查“无”值,因此您要使用“是”/“不是”。

就我个人而言,我发现依赖表达式中 None 值的行为是不好的形式(在许多其他语言中经常会触发 NullPointerException 或类似错误的事情),所以虽然我不完全确定你想要实现什么,但通常我写的类似代码如下:

if x is not None and y is not None:
于 2013-10-16T10:09:35.883 回答