- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
增强赋值语句
增强赋值语句适用于任何支持隐式二元表达式的类型。例如,下面是两种让变量名增加1的方式。
用于字符串时,增强形式会改为执行合并运算。于是,在这里第二行就相当于输入较长的S=S+"SPAM":
如表11-2所示,每个Python二元表达式的运算符(每个运算符在左右两侧都有值),都有对应的增强赋值形式。例如,X*=Y执行乘法并赋值,X>>=Y执行向右位移并赋值。X//=Y(floor除法)则是在2.2版新增加的赋值形式。
增强赋值语句有三个优点[1]。
·程序员输入减少。
·左侧只需计算一次。在X+=Y中,X可以是复杂的对象表达式。在增强形式中,则只需计算一次。然而,在完整形式X=X+Y中,X出现两次,必须执行两次。因此,增强赋值语句通常执行得更快。
·优化技术会自动选择。对于支持原处修改的对象而言,增强形式会自动执行原处的修改运算,而不是相比来说速度更慢的复制。
在这里的最后一点需要多一点的说明。就增强赋值语句而言,在原处的运算可作为一种优化而应用在可变对象上。回想一下,列表可以用各种方式扩展。要增加单个的元素到列表末尾时,我们可以合并或调用append:
此外,要把一组元素增加到末尾,我们可以再次使用合并,或者调用列表的extend方法[2]。
在两种情况下,合并对共享对象引用产生的副作用可能会更小,但是,通常会比对等的原处形式运行得更慢。合并操作必须创建一个新的对象,把左侧的复制到列表中,然后再把右侧的复制到列表中。相比而言,原处方法调用直接在一个内存块末尾添加项。
当我们使用增强赋值语句来扩展列表时,可以忘记这些细节。例如,Python会自动调用较快的extend方法,而不是使用较慢的“+”合并运算。
增强赋值以及共享引用
这种行为通常就是我们想要的,但注意,这隐含了“+=”对列表是做原处修改的意思。于是,完全不像“+”合并,总是生成新对象。就所有的共享引用情况而言,只有其他变量名引用的对象被修改,其差别才可能体现出来:
这只对于列表和字典这类可变对象才重要,而且是相当罕见的情况(至少,直到影响程序代码时才算!)。就像往常一样,如果你需要打破共享引用值的结构,就要对可变对象进行拷贝。
[1]C/C++程序员要注意:虽然Python现在支持像X+=Y这类语句,但还没有C的自动递增/递减运算符(例如,X++和--X)。这些无法对应到Python中的对象模型,因为Python没有像对数字那样对不可变对象进行在原处的修改的概念。
[2]就像第6章的建议,我们也可以使用分片赋值语句(例如,L[len(L):]=[11,12,13]),但这种方式和一些简单的extend方法相似。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论