freeCodeCamp/guide/chinese/python/comparisons/index.md

84 lines
3.4 KiB
Markdown
Raw Normal View History

---
title: Python Comparisons
localeTitle: Python比较
---
[Python文档 - 比较](https://docs.python.org/3/library/stdtypes.html#comparisons)
Python中有八个比较操作。它们都具有相同的优先级高于布尔操作的优先级。比较可以任意链接;例如, `x < y <= z`等效于`x < y and y <= z` ,除了`y`仅被评估一次(但在两种情况下,当`x < y`被发现为假时,根本不评估`z` )。
此表总结了比较操作:
操作|含义
\--------- | -----------------------
`<` |严格不足
`<=` |小于或等于 `>` |严格大于 `>=` |大于或等于 `==` |等于 `!=` |不等于 `is` |对象身份
`is not` |否定了对象的身份
除了不同的数字类型之外,不同类型的对象永远不会相等。此外,某些类型(例如,函数对象)仅支持简并比较概念,其中该类型的任何两个对象都是不相等的。在将复数与另一个内置数值类型进行比较时,当对象具有无法比较的不同类型时,或者在没有定义的其他情况下, `<` `<=` `>`和`>=`运算符将引发`TypeError`异常排序。
除非类定义`__eq__()`方法,否则类的非相同实例通常会比较为不相等。
除非该类定义了足够多的方法`__lt__()` `__le__()` `__gt__()`和`__ge__()` ,否则不能对相同类的其他实例或其他类型的对象排序类的实例(一般情况下) `__lt__()`和`__eq__()`就足够了,如果你想要比较运算符的常规含义)。
`is`和`is not`运营商的行为无法定制;它们也可以应用于任何两个对象,并且永远不会引发异常。
我们还可以将`<`和`>`运算符链接在一起。例如, `3 < 4 < 5`将返回`True` ,但`3 < 4 > 5`将不返回`True` 。我们也可以链接相等运算符。例如, `3 == 3 < 5`将返回`True`但`3 == 5 < 5`将不返回`True`
### 平等比较 - “是”与“==”
在Python中有两个比较运算符允许我们检查两个对象是否相等。 `is`运算符和`==`运算符。但是,他们之间有一个关键的区别!
'是'和'=='之间的关键区别可以概括为:
* `is`用来比较**认同**
* `==`用于比较**相等**
## 例
首先在Python中创建一个列表。
```python
myListA = [1,2,3]
```
接下来,创建该列表的副本。
```python
myListB = myListA
```
如果我们使用'=='运算符或'is'运算符,两者都将产生**True**输出。
```python
>>> myListA == myListB # both lists contains similar elements
True
>>> myListB is myListA # myListB contains the same elements
True
```
这是因为myListA和myListB都指向同一个列表变量我在Python程序的开头定义了该变量。两个列表在身份和内容上完全相同。
但是,如果我现在创建一个新列表怎么办?
```python
myListC = [1,2,3]
```
执行`==`运算符仍然显示两个列表在内容方面是相同的。
```python
>>> myListA == myListC
True
```
但是,执行`is`运算符现在将生成`False`输出。这是因为myListA和myListC是两个不同的变量尽管包含相同的数据。即使它们看起来一样但它们是**不同的** 。
```python
>>> myListA is myListC
False # both lists have different reference
```
总结一下:
* 如果两个变量都指向同一个引用, `is`表达式输出为`True`
* 如果两个变量包含相同的数据,则`==`表达式输出`True`