我在这里有一些代码:
m = None
n = None
if not m:
print "Something happens"
>>> Something happens
如果我这样做:
if not m and n:
print "Something happens"
什么都没发生。
但我能做到:
m, n = 1,2
if m and n:
print "Something happens"
>>> Something happens
为什么如果不以同样的方式处理? “如果不是”,不接受'和'陈述吗?
谢谢
答案 0 :(得分:12)
您遇到operator precedence问题。
if not m and n
相当于if (not m) and n
。您想要的是if not m and not n
或if not (m or n)
。
另请参阅:De Morgan's Laws
答案 1 :(得分:2)
not
应用于其closet操作数。您写了if not m and n
not
适用于m
的{{1}},True
因and
而n
评估为False
因此整个陈述被评估为False
。
答案 2 :(得分:1)
我认为您正在寻找这篇文章:Truth Value Testing
可以测试任何对象的真值,用于if或while条件或下面布尔运算的操作数。以下值被视为false:
- 无
- 假
- 任何数字类型的零,例如
0
,0L
,0.0
,0j
。- 任何空序列,例如
''
,()
,[]
。- 任何空映射,例如
{}
。- 用户定义类的实例,如果类定义了
__nonzero__()
或__len__()
方法,则该方法返回整数零或bool值为False。所有其他值都被认为是真的 - 因此许多类型的对象始终为真。 除非另有说明,否则具有布尔结果的操作和内置函数始终返回
0
或False
表示false,1
或True
表示true。 (重要的例外:布尔运算或者并且始终返回其中一个操作数。)
特别是下一章解释了你的案例(Boolean Operations — and
, or
, not
):
的优先级不低于非布尔运算符