Python中比较运算符的评估表现出乎意料

时间:2015-01-30 03:23:04

标签: python operator-precedence

我正在学习本学期的Python入门课程(使用3.4),最近遇到了一个关于运算符优先级的练习,并使用括号使语句评估为true。

确切的问题是:

Add a single pair of parentheses to the expression so that it evaluates to true.
1 < -1 == 3 > 4

我认为正确答案是:

1 < -1 == (3 > 4)

鉴于比较运算符都处于相同的优先级,它们应该从左到右进行评估,因此它应该如下评估:

1 < -1 == (3 > 4) 
1 < -1 == False
False == False
True

但是当我运行代码时它仍然返回false。我看到了这个问题comparison operators' priority in Python vs C/C++,这个表达的结果对我有意义;但是在这种情况下,在评估表达式的其余部分之前,我强迫对后一个语句进行评估,所以我不明白为什么我仍然得到错误的答案。

过去一小时我一直盯着它,我觉得我可能会忽视一些明显的东西;如果有人能够提供一些有关正确解决方案的见解,那将非常感激。

4 个答案:

答案 0 :(得分:2)

这项任务显然是不可能的。考虑以下三种情况:

  1. -1之前有一个空位。

  2. -1之间有一个开放的关系。

  3. 在其他任何地方都有一个空位。

  4. 这三种情况代表括号的每个可能位置。

    在第一种情况下,我们有1 < ( ... ),其中省略号是布尔表达式。由于1不小于TrueFalse,因此整个表达式为False

    在第二种情况下,我们有1 < -( ...),其中省略号是一个布尔表达式。由于1不小于-True-False,因此整个表达式为False

    在第三种情况下,我们有1 < -1 == ...。由于链式运算符表达式的所有分支必须为True,并且由于1 < -1为False,因此整个表达式为False

    因此,在每种可能的情况下,结果都是假的。

答案 1 :(得分:1)

您走在正确的轨道上,但由于比较链接,您将拥有:

1 < -1 == (3 > 4) 
1 < -1 == False
1 < -1 and -1 == False
False and False
False

请注意,我们不会从左到右评估第二行,而是将两个比较与一个和。链接在一起。

只有几种有效的方法可以为此添加一对括号,因此我们可以轻松地检查所有其他括号:

(1 < -1 == 3 > 4)
False #Trivially

(1 < -1) == 3 > 4
False == 3 > 4
False == 3 and 3 > 4
False and False
False

1 < (-1 == 3) > 4
1 < False > 4
1 < False and False > 4
False and False
False

看起来这个问题没有答案!

编辑:

糟糕! Rob指出我们忘记了:

1 < -(1 == 3) > 4
1 < -False > 4
1 < 0 > 4
1 < 0 and 0 > 4
False and False
False

答案 2 :(得分:1)

3>4给出False-1 == False给出False1 < False给出False。 因此, 1 < -1 == 3 > 4变为False

给出适当的括号,使语句在语义上正确。

(1 < -1) == (3 > 4)

答案 3 :(得分:0)

(1 <-1)==(3> 4)

False == False