返回介绍

比较、相等性和真值

发布于 2024-01-29 22:24:16 字数 2215 浏览 0 评论 0 收藏 0

所有的Python对象也可以支持比较操作——测试相等性、相对大小等。Python的比较总是检查复合对象的所有部分,直到可以得出结果为止。事实上,当嵌套对象存在时,Python能够自动遍历数据结构,并从左到右递归地应用比较,要多深就走多深。过程中首次发现的差值将决定比较的结果。

例如,在比较列表对象时将自动比较它的所有内容。

在这里L1和L2被赋值为列表,虽然相等,却是不同的对象。因为Python的引用特性(我们在第6章曾经学过),有两种方法可以测试相等性:

·“==”操作符测试值的相等性。Python运行相等测试,递归地比较所有内嵌对象。

·"is"表达式测试对象的一致性。Python测试二者是否是同一个对象(也就是说,在同一个内存地址中)。

在上一个例子中,L1和L2通过了“==”测试(他们的值相等,因为它们的所有内容都是相等的),但是is测试却失败了(它们是两个不同的对象,因此有不同的内存区域)。我们注意一下短字符串会出现什么情况:

在这里,我们应该能又一次得到两个截然不同的对象碰巧有着相同的值:“==”应该为真,而is应该为假。但是因为在Python内部暂时储存并重复使用短字符串作为最佳化,事实上内存里只有一个字符串'spam'供S1和S2分享。因此,"is"一致性测试结果为真。为了得到更一般的结果,我们需要使用更长的字符串:

当然,由于字符串是不可变的,对象缓存机制和程序代码无关——无论有多少变量与它们有关,字符串是无法在原处修改的。如果一致性测试令你感觉到困惑,可以再回头看一看第6章的相关内容回忆一下对象引用的概念。

凭经验来说,“==”几乎是所有等值检验时都会用到的操作符;而is则保留了极为特殊的角色。你会在本书后面部分看到一些使用这些操作符的情况。

相对大小的比较也能够递归地应用于嵌套的数据结构。

因为嵌套的3大于2,这里的L1大于L2。上面最后一行的结果的确是一个含有三个对象的元组——我们输入的三个表达式的结果(这是一个不带圆括号的元组的实例)。

一般来说,Python中不同的类型的比较方法如下:

·数字通过相对大小进行比较。

·字符串是按照字典顺序,一个字符接一个字符地对比进行比较("abc"<"ac")。

·列表和元组从左到右对每部分的内容进行比较。

·字典通过排序之后的(键、值)列表进行比较。字典的相对大小比较在Python 3.0中不支持,但是,它们在Python 2.6及更早的版本中有效,就像是比较排序的(键、值)列表一样。

·数字混合类型比较(例如,1<'spam')在Python 3.0中是错误的。Python 2.6中允许这样的比较,但是使用一种固定但任意的排序规则。通过代理,这也适用于排序,它在内部使用比较:非数字的混合类型集合不能在Python 3.0中排序。

一般来说,结构化对象的比较就好像是你把对象写成文字,并从左到右一次一个地比较所有部分。在之后的章节中,我们将会看到其他可以改变比较方法的对象类型。

Python 3.0的字典比较

再次看看前面小节介绍的优点中的最后一点。在Python 2.6和更早的版本中,字典支持大小比较,就好像要比较排序的键/值列表:

在Python 3.0中,字典的大小比较删除了,因为当期望相等的时候,它们导致太多的负担(在Python 3.0中,相等性使用一种优化的方案,并且不会直接比较排序的键/值列表)。Python 3.0中的替代方法,要么编写循环来根据键比较值,要么手动比较排序的键/值列表——items字典方法的和内置的sorted足够了:

实际上,大多数程序需要这种行为,以开发出比这里的解决方案或Python 2.6中的最初行为更高效的方式来比较字典中的数据。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文