为什么在[False,True]中不是(True)“返回False?
如果我这样做:
>>> False in [False, True]
True
这返回True
。 只是因为False
在列表中。
但是,如果我这样做:
>>> not(True) in [False, True]
False
这返回False
。 而not(True)
等于False
:
>>> not(True)
False
为什么?
运算符优先级 2.x,3.x. 优先级not
低于in
。的优先级。 所以它相当于:
>>> not (True in [False, True])
False
这是你想要的:
>>> (not True) in [False, True]
True
正如@Ben指出的那样:建议不要写not(True)
,不要写not True
。 前者使它看起来像一个函数调用,而not
一个操作符,而不是一个函数。
not x in y
中的x not in y
被评估为x not in y
您可以通过反汇编代码来查看究竟发生了什么。 第一个案例按照您的预期工作:
>>> x = lambda: False in [False, True]
>>> dis.dis(x)
1 0 LOAD_GLOBAL 0 (False)
3 LOAD_GLOBAL 0 (False)
6 LOAD_GLOBAL 1 (True)
9 BUILD_LIST 2
12 COMPARE_OP 6 (in)
15 RETURN_VALUE
第二种情况,评估结果True not in [False, True]
,这是False
:
>>> x = lambda: not(True) in [False, True]
>>> dis.dis(x)
1 0 LOAD_GLOBAL 0 (True)
3 LOAD_GLOBAL 1 (False)
6 LOAD_GLOBAL 0 (True)
9 BUILD_LIST 2
12 COMPARE_OP 7 (not in)
15 RETURN_VALUE
>>>
你想表达的却是(not(True)) in [False, True]
这符合市场预期,是True
,并且你可以看到为什么:
>>> x = lambda: (not(True)) in [False, True]
>>> dis.dis(x)
1 0 LOAD_GLOBAL 0 (True)
3 UNARY_NOT
4 LOAD_GLOBAL 1 (False)
7 LOAD_GLOBAL 0 (True)
10 BUILD_LIST 2
13 COMPARE_OP 6 (in)
16 RETURN_VALUE
运算符优先级。 in
绑定比not
更紧密,所以你的表达不等于not((True) in [False, True])
。