多个 != 与 == 运算符

Multiple != versus == operators

以下程序完全符合预期:

data = input("Input the length of three sides of a triangle: ").strip()

if data.count(',') != 2:
    print("You did not enter the lengths of three sides: ")

a, b, c = data.split(', ')


def triangle_type(s1, s2, s3):
    if s1 == s2 == s3:
        return print("The values entered represent an equilateral triangle.")
    elif s1 != s2 and s1 != s3 and s2 != s3:
        return print("The values entered represent a scalene triangle.")
    else:
        if s1 == s2 or s1 == s3 or s2 == s3:
            return print("The values entered represent an isosceles triangle.")


triangle_type(int(a), int(b), int(c))

但是,如果我将第二个条件更改为以下内容:

elif s1 != s2 != s3:

它没有按预期工作。

如果我输入 3、6、3,我得到:

Input the length of three sides of a triangle: 3, 6, 3
The values entered represent a scalene triangle.

这是不正确的。这应该清楚地匹配条件 #3(等腰)。

第一个版本的代码可以正常工作。

我对两件事感到困惑:

1) 为什么第二个版本运行不正常?

2) 如果第二个版本无效,那么为什么第一个条件有效 正确吗?

鉴于 != 运算符的上述行为,我希望必须像 a == b 和 a == c 和 b == c 一样对待 a == b == c,但我没有不得不。

链接版本相当于s1 != s2 and s2 != s3;它不需要 s1 != s3,因为不等式是不可传递的。

当您在 Python 中链接比较时,它 and 将它们放在一起,并且它只进行与比较运算符一样多的比较。所以

if s1 == s2 == s3:

等同于

if s1 == s2 and s2 == s3:

这是有效的,因为如果这两个条件都是 True,那么 s1 必须 也等于 s3(因为它们'都等于 s2).

但是

if s1 != s2 != s3:

等同于

if s1 != s2 and s2 != s3:

正如您所发现的,对于值 3、6 和 3,上述两个条件是 True,但第三个假设条件(s1 != s3)不是 True.这不会像您预期的那样工作,因为 Python 没有进行第三次比较。