2011-03-11 155 views
2

我有这样的代码:Python布尔帮助!

if (X or Y) == ("Cat" or "Dog" or "Fish" or "Bird"): 
    print X, Y 

它只有X == "Cat"工作。有人在这里知道我的错误吗?

回答

11

我想你想这样的逻辑:

animals = ["Cat", "Dog", "Fish", "Bird"] 
if X in animals or Y in animals: 
    print X, Y 

在你的代码中表达(“猫”和“狗”或“鱼”或“鸟”)被视为一个逻辑表达式,我我确定你不想要。正如它发生这种表达评估为“猫”,这解释了你观察到的行为。


>>> 'cat' or 'dog' 
'cat' 
>>> 'cat' and 'dog' 
'dog' 

这些都是串逻辑运算。非空字符串被视为真值。空字符串被视为False。 Python的逻辑运算符返回与操作数相同类型的值(假设两个操作数都是相同的类型)。短路评估解释了这里的orand的行为。

在任何情况下,对字符串执行逻辑操作都没有意义!

+0

现在这是一个伟大的写作。享受这个当之无愧的+1;) – delnan 2011-03-11 16:33:20

+0

@delnan谢谢,但太糟糕了,我超过了帽子! – 2011-03-11 16:34:09

1

发生什么事是你正在努力X or Y,给你只是X。然后,你正在制定Cat or Dog or..,只给你Cat,因为它不是0。

你想要的是:

if X in ("Cat","Dog", "Fish", "Bird") or Y in ("Cat","Dog", "Fish", "Bird"): 
    #taa daa! 
4

如果是"trucy",或它的第二个参数否则or运营商在Python返回第一个参数。比较的右侧始终评估为"Cat",而左侧为X,只要X为“真实”。

用最简洁的方式来获得你正在寻找的逻辑是

if set((X, Y)) & set(("Cat", "Dog", "Fish", "Bird")): 
    # whatever 
+0

我给你+1,但我达到了我的选票限额。 – 2011-03-11 16:31:21

0

您的问题是在Python评估or的方式。如果a是真(非零,或非空字符串或对象)返回一个;否则返回b。所以"string" or b将始终评估为"string"

所以"Cat" or "Dog" or "Fish" or "Bird"将始终评估为"Cat"
X or Y将始终评估为X(只要X是一个或多个字符的字符串)
X=="Cat"显然,只有当X是“猫”真。

animals = set(["Cat","Dog","Fish","Bird"]) 
if X in animals or Y in animals: 
    print X, Y