Python Boolean, помогите! - PullRequest
       31

Python Boolean, помогите!

2 голосов
/ 11 марта 2011

У меня есть такой код:

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

Работает только если X == "Cat". Кто-нибудь знает мою ошибку здесь?

Ответы [ 4 ]

11 голосов
/ 11 марта 2011

Я думаю, вы хотите логику, как это:

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

В вашем коде выражение («Кошка» или «Собака», «Рыбка» или «Птица») рассматривается как логическое выражение, которое, я уверен, вам не нужно. Как это происходит, это выражение оценивается как «Кошка», что объясняет ваше наблюдаемое поведение.


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

Это логические операции со строками. Непустые строки считаются истинными значениями. Пустые строки считаются ложными. Логические операторы Python возвращают значения того же типа, что и операнды (при условии, что оба операнда имеют одинаковый тип). Оценка короткого замыкания объясняет поведение для or и and здесь.

В любом случае бессмысленно выполнять логические операции со строками!

4 голосов
/ 11 марта 2011

Оператор or в Python возвращает свой первый аргумент, если это "trucy" , или его второй аргумент в противном случае. Правая часть вашего сравнения всегда оценивается как "Cat", а левая часть X, пока X означает "перемирие".

Самый краткий способ получить логику, которую вы ищете, это

if set((X, Y)) & set(("Cat", "Dog", "Fish", "Bird")):
    # whatever
1 голос
/ 11 марта 2011

Что происходит, вы работаете 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!
0 голосов
/ 11 марта 2011

Ваша проблема в том, как Python оценивает or.Если a истинно (не ноль, или непустая строка, или объект) a or b возвращает a;в противном случае возвращается b.Таким образом, "string" or b всегда будет оцениваться в "string".

Так что "Cat" or "Dog" or "Fish" or "Bird" всегда будет оцениваться в "Cat",
и X or Y всегда будет оцениваться в X (до тех пор, пока Xстрока из одного или нескольких символов)
и X=="Cat", очевидно, имеют значение true, только если X является "Cat".

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