- 译者序
- 前言
- 第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 各部分练习题的解答
- 作者介绍
- 封面介绍
第11章 赋值、表达式和打印
赋值语句
我们已经使用Python的赋值语句把对象赋给一个名称。其基本形式是在等号左边写赋值语句的目标,而要赋值的对象则位于右侧。左侧的目标可以是变量名或对象元素,而右侧的对象可以是任何会计算得到的对象的表达式。绝大多数情况下,赋值语句都很简单,但有些特性要专门记住的,如下所示。
·赋值语句建立对象引用值。正如第6章讨论过的,Python赋值语句会把对象引用值存储在变量名或数据结构的元素内。赋值语句总是建立对象的引用值,而不是复制对象。因此,Python变量更像是指针,而不是数据存储区域。
·变量名在首次赋值时会被创建。Python会在首次将值(即对象引用值)赋值给变量时创建其变量名。有些(并非全部)数据结构元素也会在赋值时创建(例如,字典中的元素,一些对象属性)。一旦赋值了,每当这个变量名出现在表达式时,就会被其所引用的值取代。
·变量名在引用前必须先赋值。使用尚未进行赋值的变量名是一种错误。如果你试图这么做,Python会引发异常,而不是返回某种模糊的默认值;如果返回默认值,就很难在程序中找出输入错误的地方。
·执行隐式赋值的一些操作。本节中,我们关心的是=语句,但在Python中,赋值语句会在许多情况下使用。例如,模块导入、函数和类的定义、for循环变量以及函数参数全都是隐式赋值运算。因为赋值语句在任何出现的地方的工作原理都相同,所有这些环境都是在运行时把变量名和对象的引用值绑定起来而已。
赋值语句的形式
虽然赋值运算是Python中通用并且一般的概念,但本章的主要内容在于赋值语句。表11-1说明Python中不同的赋值语句的形式。
表11-1中的第一种形式是至今最常见的——把一个变量名(或数据结构元素)绑定到单个对象上。实际上,仅仅使用这些基本的形式就可以搞定所有的工作了。其他的表中的项目代表了程序员通常会觉得很方便的特定的和可选的形式。
元组及列表分解赋值
表中第二和第三种形式是相关的。当在“=”左边编写元组或列表时,Python会按照位置把右边的对象和左边的目标从左至右相配对。例如,表中第二行,字符串'yum'赋值给变量名spam,而变量名ham则绑定至字符串'YUM'。从内部实现上来看,Python会先在右边制作元素的元组,所以这通常被称为元组分解赋值语句。
序列赋值语句
在最新的Python版本中,元组和列表赋值语句已统一为现在所谓的序列赋值语句的实例——任何变量名的序列都可赋值给任何值的序列,而Python会按位置一次赋值一个元素。实际上,我们可以混合和比对涉及的序列类型。例如,表11-1的第四行,把变量名的元组和字符的字符串对应起来:a赋值为's',b赋值为'p'等。
扩展的序列解包
在Python 3.0中,一种新形式的序列赋值允许我们更灵活地选择要赋值的一个序列的部分。例如,表11-1中的第五行,用右边的字符串的第一个字母来匹配a,用剩下的部分来匹配b:a赋值为's',b赋值为'pam'。这为手动分片操作的结果的赋值提供了一种简单的替代方法。
多重目标赋值
表11-1的第五行指的是多重目标形式的赋值语句。在这种形式中,Python赋值相同对象的引用值(最右边的对象)给左边的所有目标。表11-1中,变量名spam和ham两者都赋值成对相同的字符串对象'lunch'的引用。效果就好像我们写成ham='lunch',而后面再写spam=ham,这是因为ham会得到原始的字符串对象(也就是说,它并不是这个对象的独立的拷贝)。
增强赋值语句
表11-1的最后一行是增强赋值语句的例子——一种以简洁的方式结合表达式和赋值语句的简写形式。例如,"spam+=42"相当于"spam=spam+42",然而增强形式输入较少,而且通常执行得更快。此外,如果操作主体是可变的并且支持这一操作,增强赋值通过选择原处更新操作而不是对象副本,从而可以更快地运行。在Python中,每个二元表达式运算符都有增强赋值语句。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论