对三个对象使用"=="运算符

Rus*_*hal 6 python equality operators

这两种检查三个对象之间的相等性的方法之间是否有任何计算差异?

我有两个变量:xy.说我这样做:

>>> x = 5
>>> y = 5
>>> x == y == 5
True
Run Code Online (Sandbox Code Playgroud)

这有什么不同于:

>>> x = 5
>>> y = 5
>>> x == y and x == 5
True
Run Code Online (Sandbox Code Playgroud)

如果他们是这样的False呢?

>>> x = 5
>>> y = 5
>>> x == y == 4
False
Run Code Online (Sandbox Code Playgroud)

和:

>>> x = 5
>>> y = 5
>>> x == y and x == 4
False
Run Code Online (Sandbox Code Playgroud)

它们的计算方式有什么不同吗?

另外,怎么x == y == z工作?

提前致谢!

Ned*_*der 13

Python已经链接了比较,所以这两种形式是等价的:

x == y == z
x == y and y == z
Run Code Online (Sandbox Code Playgroud)

除了在第一个中,y仅被评估一次.

这意味着你也可以写:

0 < x < 10
10 >= z >= 2
Run Code Online (Sandbox Code Playgroud)

你也可以写下令人困惑的东西:

a < b == c is d   # Don't  do this
Run Code Online (Sandbox Code Playgroud)

初学者有时会被绊倒:

a < 100 is True   # Definitely don't do this!
Run Code Online (Sandbox Code Playgroud)

这将永远是假的,因为它是相同的:

a < 100 and 100 is True   # Now we see the violence inherent in the system!
Run Code Online (Sandbox Code Playgroud)

  • 请注意,链总是比较相邻元素,因此`a == b == c == d`等同于'a == b和b == c和c == d`.它并没有将它们全部比作"a".对于数字(和相等),这很少很重要,但对于某些比较具有非传递语义的对象,它可能会变得奇怪.例如,在Python 2中,不同类型的对象比较不相等(除非它们经过特殊编码以便彼此了解),因此`decimal.Decimal(0)== fractions.Fraction(0)`是'False`.但是,`decimal.Decimal(0)== 0 == fractions.Fraction(0)`是'True`.(Python 3解决了这个问题.) (2认同)