为什么`False是False是False`评价为'True`?

pba*_*ski 41 python python-internals

为什么在Python中以这种方式进行评估:

>>> False is False is False
True
Run Code Online (Sandbox Code Playgroud)

但是当试用括号时,表现如预期的那样:

>>> (False is False) is False
False
Run Code Online (Sandbox Code Playgroud)

zeh*_*ard 65

像链接操作符a is b is c相当于a is b and b is c.

所以第一个例子是False is False and False is False,评估True and True哪个评估结果True

有括号导致一个评估的结果被下一个变量相比(如你说你期望的),所以(a is b) is c比较的结果a is bc.

  • 因为它适用于任何链 - 如`1 <2 <3 <4`所以:`1 <2和2 <3和3 <4` (5认同)

the*_*eye 26

引用Python官方文档,

形式上,如果a,b,c,..., y,z是表达式并且op1,op2,...,opN是比较操作符,则a op1 b op2 c ... y opN z等同于a op1 b and b op2 c and ... y opN z,除了每个表达在评价最多一次.

所以,False is False is False被评估为

(False is False) and (False is False)
Run Code Online (Sandbox Code Playgroud)

第二个False is False表达式使用False原始表达式中的第二个表达式,它有效地转换为

True and True
Run Code Online (Sandbox Code Playgroud)

这就是第一个表达式评估的原因True.

但在第二个表达式中,评估顺序如下.

(False is False) is False
Run Code Online (Sandbox Code Playgroud)

这实际上是

True is False
Run Code Online (Sandbox Code Playgroud)

这就是结果的原因False.


Mat*_*ias 14

你的表达

False is False is False
Run Code Online (Sandbox Code Playgroud)

被视为

(False is False) and (False is False)
Run Code Online (Sandbox Code Playgroud)

所以你得到了

True and True
Run Code Online (Sandbox Code Playgroud)

并评估为True.

您也可以与其他运营商一起使用这种链接.

1 < x < 10
Run Code Online (Sandbox Code Playgroud)

  • 所以`0> 2是False`返回`False` - >多么直观的行为:) (2认同)

lqh*_*gbl 5

我认为这False is False is False意味着(False is False) and (False is False),但(False is False) is False意味着:

>>> (False is False) is False
False
>>> a_true = (False is False)
>>> a_true
True
>>> a_true is False
False
Run Code Online (Sandbox Code Playgroud)

所以,你得到的结果.