Python一一赋值
赋值语句
特性:
(1).赋值语句建立对象引用值。
(2).变量名在首次赋值时会被创建。
(3).变量名在引用前必须先赋值。
(4).执行隐式赋值的一些操作。(例如,模块导入、函数和类的定义、for循环变量以及函数参数全都是隐式赋值运算)
形式:
序列赋值
Python中原始的元组和列表赋值语句形式,最后已被通用化,以接受右侧可以是任何类型的序列,只要长度相等即可。
事实上,从技术的角度讲,序列赋值语句支持右侧任何可迭代的对象,而不仅仅局限于任何序列。这是更为通用的概念。
高级序列赋值语句模式
注意:虽然可以在“=”符号两侧混合相匹配的序列类型,右边元素的数目还是要跟左边的变量的数目相同,不然会产生错误,如下:
想要更通用的话,需要使用分片。
Python3.0中扩展序列解析包
前面小节展示了如何使用手动分片以使得序列赋值更为通用。在Python3.0中(但不是Python2.6中),序列赋值变得更为通用。
一个带有单个星号的名称,可以在赋值目标中使用,以指定对于序列的一个更为通用的匹配一一一个列表赋给了带星号的名称,该列表收集了序列中没有赋值给其他名称的所有项。
扩展的解包实例运用
和常规的序列赋值一样,扩展的序列解包语法对于任何序列类型都有效,而不只是对列表有效。
这和分片内在的相似,但是不完全相同一一 一个序列解包赋值总是返回多个匹配项的一个列表,而分片把相同类型的一个序列作为分片的对象返回:
边界情况
尽管扩展的序列解包很灵活,一些边界情况还是值得注意。首先,带星号的名称可能只匹配单个的项,但是,总是会向其赋值一个列表:
其次,如果没有剩下的内容可以匹配带星号的名称,就会赋值一个空的列表,不管该名称出现在哪里。
最后,如果带多个星号的名称,或者如果值少了而没有带星号的名称,以及如果带星号的名称自身没有编写到一个列表中,都将发生错误:
增强赋值以及共享引用
变量命名规则
命名惯例