python中有一个很奇怪的数据类型-----元祖(tuple),元祖由括号()表示,被称为只读列表,顾名思义,元祖可以看成一个列表,但是只有查询的操作。
1、元祖的创建
# 元祖的创建
# -*- coding:utf-8 -*-
# author: kenny
# 元祖的创建
# 创建方法一:多个元素情况,我们可以直接创建(不推荐)
tuple_1 = 1, 2, 3, 4
print(tuple_1) # (1, 2, 3, 4)
# 创建方法二:用tuple()创建
tuple_2 = tuple((1, 2, 3, 4, 5))
print(tuple_2) # (1, 2, 3, 4, 5)
# 创建方法三:用()创建
tuple_3 = (1, 2, 3, 4, 5, 6)
print(tuple_3) # (1, 2, 3, 4, 5, 6)
需要注意的是,元祖都是一组一组的,单个元素不能创建为元祖,此时数据的类型为单个元素本身的类型。如果想创建单个元素的元祖,需要在创建的时候在元素后面加逗号,如下例:
tuple_4 = (1)
print(type(tuple_4)) # <class 'int'>
tuple_5 = ("1001")
print(type(tuple_5)) # <class 'str'>
tuple_6 = ("1002",)
print(type(tuple_6)) # <class 'tuple'>
2、元祖的查询
tuple_7 = (1, 2, ['a', 'b', 'c'], 'd', 'e', ('name', 'city'))
# 打印索引为0的元素
print ("tuple_7[0] =", tuple_7[0]) # tuple_7[0] = 1
# 切片:从索引为1到最后一个元素
print ("tuple_7[1:] =", tuple_7[1:]) # tuple_7[1:] = (2, ['a', 'b', 'c'], 'd', 'e', ('name', 'city'))
# 切片:从第一个元素到倒是第二个元素
print ("tuple_7[:-1] =", tuple_7[:-1]) # tuple_7[:-1] = (1, 2, ['a', 'b', 'c'], 'd', 'e')
# 等价于tuple_7[1:] 从左到右一个个去取,步长为1
print ("tuple_7[1::1] =", tuple_7[1::1]) # tuple_7[1::1] = (2, ['a', 'b', 'c'], 'd', 'e', ('name', 'city'))
# 反向输出 步长为1
print ("tuple_7[::-1]", tuple_7[::-1]) # tuple_7[::-1] (('name', 'city'), 'e', 'd', ['a', 'b', 'c'], 2, 1)
# 反向输出 步长为2(隔一个去取))
print ("tuple_7[::-2]", tuple_7[::-2]) # tuple_7[::-2] (('name', 'city'), 'd', 2)
# 统计元素个数
print(tuple_7.count("2")) # 0
# 返回元素的索引位置
print(tuple_7.index(2)) # 1
# 计算元组中元素的个数
print(len(tuple_7)) # 6
之所以说元祖很奇怪,是因为元祖本身是不可变数据,即元祖一旦被定义,数据便不能被修改了,但是有时候我们会看到有些操作可以元祖的数据,例如下面的例子:
tuple_8 = (1, "a", ["list_1", 2])
print(tuple_8) # (1, 'a', ['list_1', 2])
tuple_8[2].append("list_add")
print(tuple_8) # (1, 'a', ['list_1', 2, 'list_add'])
这是为什么呢,不是说元祖一旦被确定,数据就不能被修改了吗。其实元祖不能被修改是简单的说法,全称是元祖内元素在内存中的地址不能被修改,就如上个例子,与其说是元祖的数据被修改,不如说是元祖内的列表的数据被修改,因为列表是可变数据,修改列表的数据后列表的地址不变,所以元祖来说地址并没有发生变化。
3、删除元祖
咦?不是说元祖只有查询操作吗?为什么又能删除了呢?对于这一点疑问,我想说的是:这不是删除元祖的元素,而是删除元祖这个对象(好吧,只是我凑字数来了)
tuple_9 = (1, "a", ["list_1", 2])
print(tuple_9) # (1, 'a', ['list_1', 2])
del tuple_9
print(tuple_9) # NameError: name 'tuple_9' is not defined