- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
比较、相等性和真值
例如,在比较列表对象时将自动比较它的所有内容。
在这里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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论