【发布时间】:2015-03-22 04:00:12
【问题描述】:
为什么在 Python 中以这种方式评估它:
>>> False is False is False
True
但是当用括号尝试时表现如预期:
>>> (False is False) is False
False
【问题讨论】:
为什么在 Python 中以这种方式评估它:
>>> False is False is False
True
但是当用括号尝试时表现如预期:
>>> (False is False) is False
False
【问题讨论】:
像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 b 的结果与c 进行比较。
【讨论】:
eval(" is ".join(["False" for i in range(n)]))
1 < 2 < 3 < 4 所以:1<2 and 2<3 and 3<4
None is None is None。
你的表情
False is False is False
被视为
(False is False) and (False is False)
所以你得到
True and True
计算结果为True。
您也可以将这种链接与其他运算符一起使用。
1 < x < 10
【讨论】:
0 > 2 is False 返回False -> 多么直观的行为:)
(0 > 2) is False
>>> False is False is False
True
在这种情况下,每个 False 对都会被评估。前两个 False 被求值,如果是True,那么第二个和第三个False 被求值并返回结果。
在这种情况下,False is False is False 相当于and 2 个命令的结果False is False
【讨论】:
我认为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
所以,你得到了结果。
【讨论】:
引用Python official documentation,
形式上,如果
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)
第二个False is False 表达式使用原始表达式中的第二个False,有效地转换为
True and True
这就是为什么第一个表达式计算为True。
但是在第二个表达式中,求值顺序如下。
(False is False) is False
实际上是
True is False
这就是为什么结果是False。
【讨论】: