中职电子与信息:《yhon小屋》2-2-1 元组.docx
l»>x = (1,2,3)2 »> x3 (1, 2, 3)4 »>5 »> type(x)6(class 'tuple'7»>8 »> x = (3)9 »> x10 311 »>12 »> x = (3,)13 »>14 »> x15)16 »>17 »> type(x)18class tuple、19 »>20 »> x =()21 »>22 »> type(x)23class tuple'24 »>25 »> x = tuple()26 »>Python小屋之二Python序列2.2元组与生成器推导式2.2.1 元组元组也是Python的一个重要序列结构。从形式上,元组的所有元素放在一对圆括号中, 元素之间使用逗号分隔。下面的代码演示了创建元组的方法:#直接把元组赋值给一个变量#用type。函数查看变量类型#这和x = 3的效果是一样的#如果元组中只有一个元素,必须在元素后面多写一个逗号#空元组#空元祖27 »> x28()29 »>#将其他迭代对象转换为元组30 »> tuple(range(5)31 (0, L 2, 3, 4)32 »>代码块元组属于不可变序列,一旦创建,没有热河方法可以修改元组中元素的值,也无法为元 组增加或删除元素。因此,元组没有提供append。、extend。和insert。等方法,无法向元组 中添加元素;同样,元组也没有remove。和pop()方法,也不支持对元组元素进行del操作, 不能从元组中删除元素,而只能使用del命令删除整个元组,元组也支持切片操作,但是只 能通过切片来访问元组中的元素,而不支持使用切片来修改元组中元素的值,也不支持使用 切片操作来为元组增加或删除元素。从一定程度上讲,可以认为元组是轻量级的列表,或者 “常量列表”。Python内部实现对元组做了大量优化,访问和处理速度比列表更快。如果定义了一系 列唱两只,主要用途是对它们进行遍历或者其它类似用途,而不需要对其元素进行任何修改, 那么一般建议使用元组而不用列表。元组在内部实现上不允许修改其元素值,从而使得代码 更加安全,例如,调用函数时使用元组传递参数可以放置在函数中修改元组,而使用列表很 难做到这一点。另外,作为不可变序列,与整数、字符串一样,元组可用作字典的键,而列表永远都不 能作字典的键使用,也不能作为集合中的元素,因为列表不是不可变的,或者说不可哈希。虽然元组属于不可变序列,其元素的值是不可改变的,但是如果元组中包含可变序列, 情况又变得复杂了。如下:l>»x = (l,2,3)#元组的第一个元素是列表1,2,在列表部分也讲过,列表中存储的是内存中对象的引用,可以把列表当做存储引用的容器。2»>3 »> x00 = 5#为元组中的列表增加元素4 »>5 »> x6 (5, 2, 3)7»>8 »> x0.append(8)9 »> x10 (5, 2, 8, 3)11 »>12 »> x0 = x0 + 10#试图修改元组的值,失败。13 Traceback (most recent call last):14 File "<pyshell#38>", line 1, in <module>15x0 = x0 + 1016 TypeError: 'tuple' object does not support item assignment17 »>代码块我在思考,为何x0 = x0 + 10这步操作会失败?是因为 元组x在定义时,有两个元素,第一个元素是一个列表,该列表有两个元素, 第二个元素是一个数值。虽然后续可以用append。函数向第一个元素中增加元素,这是因为 list是可变的。原来是:第一个操作的是原列表第二个是生成新的列表,由于tuple的是不可变序列,所以生成新的列表,元组就不认了。验证了一下:»> a = 1,2»> id(a)55784648>»»> a.append(8)>»»> id(a)55784648>»»> b = a + 10>»»> id(b)55110600>»代码块还真是这样啊。