为什么python会忽略条件的第一部分?

时间:2017-12-14 00:34:32

标签: python logical-operators

假设我有以下代码:

target = 'abc1234y'
if ('x' and 'y') in target:
    print('x and y are in target')

为什么if ('x' and 'y') in target是真的?

为什么这段代码不会产生错误?

为什么大括号没效果?

这似乎不符合逻辑,因为如果('x' and 'y') = true然后('y' and 'x')也应该是真的,那么情况并非如此。

同时,表达式if ('y' and 'x') in targetfalse

4 个答案:

答案 0 :(得分:4)

这里有两件事需要考虑:

and如何使用字符串

'x' and 'y'不是True

'x' and 'y''y',这可能看起来令人困惑,但在查看andor的工作方式时,这是有道理的:

    如果a为a and b,则
  • b会返回True,否则会返回a
  • 如果a为a or b,则
  • a会返回True,否则会返回b

因此:

  • 'x' and 'y''y'
  • 'x' or 'y''x'

括号做什么

括号在if语句中有效。 in的优先级高于and,这意味着如果您编写

if 'x' and 'y' in target:

它隐含意味着与

相同
if 'x' and ('y' in target):

仅检查y是否在目标字符串中。所以,使用

if ('x' and 'y') in target:

会有效果。您可以在the Python docs about Expressions中看到整个运算符优先级表。

解决方案

要实现您想要做的事情,@ Prem和@Olga已经提供了两个很好的解决方案:

if 'y' in target and 'x' in target:

if all(c in target for c in ['x','y']):

答案 1 :(得分:2)

您似乎对AND运算符的工作方式感到困惑。

'x' and 'y'
Out[1]: 'y'

'y' and 'x'
Out[1]: 'x'

因此,在第一种情况下,您会检查是否存在y。相反,您检查字符串中是否存在x

答案 2 :(得分:0)

因为它正在检查“' y'目标。 你需要这样的东西:

target = 'abc1234y'
if 'y' in target and 'x' in target:
    print('x and y are in target')

答案 3 :(得分:0)

您可能希望改用all if all(c in target for c in ['x','y']):...