具有两个条件的嵌套 if 与 if 语句的行为不同:

Nested if vs. if statement with two conditions behaves differently:

我有一个字典 my_dict1,其中包含一个键 'Error' 我还有另一个字典 my_dict2,它要么有多个键,要么是空的。我想要一个 if 语句来检查 my_dict1['Error'] 是否为 False 并检查 my_dict2 中是否有任何内容。代码如下:

my_dict1 = {'Error': False}
my_dict2 = {'somekey': True}

if my_dict1['Error'] == False:
    if len(my_dict2) > 0:
        print('ok')
else:
    print('no')

此代码的结果如预期的那样 'ok'。

if my_dict1['Error'] == False & len(my_dict2)> 0:
    print('ok')
else:
    print('no')

这导致 'no'。我对 & 语句的理解有误吗?

Am I understanding the & statement wrong?

不幸的是,是的,我是这么认为的。 &是按位与,其中逻辑与在Python.

中称为and

有关逻辑运算符和按位运算符之间差异的详细信息,请参阅此页面:https://wiki.python.org/moin/BitwiseOperators

错误源于运算符的优先级。您的表达式相当于:

my_dict1['Error'] == <b>(False & len(my_dict2))</b> > 0

现在由于 False & 1 将导致 0,因为 False 充当 0,并且 0 的按位 and-ing 和10.

表达式my_dict['Error'] == 0 > 0Falsemy_dict['Error'] == 0 会成功,但是 0 > 0 当然是 False.

如果要检查两个条件,应使用 and 运算符,例如:

if my_dict1['Error'] == False <b>and</b> len(my_dict2) > 0:
    print('ok')
else:
    print('no')

或更多 Pythonic:

if <b>not</b> my_dict1['Error'] and my_dict2:
    print('ok')
else:
    print('no')

两者并不完全相同,因为 not my_dict['Error'] 会成功,因为相应值的 真实性 True。如果项目映射到 bools,那么两者是等价的。