2

我有这样的代码:

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

只有在X == "Cat". 有人知道我的错误吗?

4

4 回答 4

11

我想你想要这样的逻辑:

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

在您的代码中,表达式(“Cat”或“Dog”或“Fish”或“Bird”)被视为我确定您不想要的逻辑表达式。碰巧这个表达式的计算结果是“Cat”,它解释了你观察到的行为。


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

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

无论如何,对字符串执行逻辑操作几乎没有意义!

于 2011-03-11T16:18:53.547 回答
4

Python 中的or运算符如果是"trucy"则返回其第一个参数,否则返回其第二个参数。比较的右侧总是评估为,只要是“trucy” "Cat",左侧的评估为。XX

获得您正在寻找的逻辑的最简洁的方法是

if set((X, Y)) & set(("Cat", "Dog", "Fish", "Bird")):
    # whatever
于 2011-03-11T16:19:19.483 回答
1

发生的事情是你正在锻炼X or Y,给你公正X。然后,你正在锻炼Cat or Dog or..,给你 just Cat,因为它不是 0。

你想要的是:

if X in ("Cat","Dog", "Fish", "Bird") or Y in ("Cat","Dog", "Fish", "Bird"):
    #taa daa!
于 2011-03-11T16:19:06.300 回答
0

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

So"Cat" or "Dog" or "Fish" or "Bird"将始终评估为"Cat"
并且X or Y将始终评估为X(只要 X 是一个或多个字符的字符串)
并且X=="Cat"显然仅当 X 是“Cat”时才为真。

animals = set(["Cat","Dog","Fish","Bird"])
if X in animals or Y in animals:
    print X, Y
于 2011-03-11T16:27:55.360 回答