Python连载(0011): 十分钟理解元组


起这么个标题只是为了吸引你进来看看,能不能十分钟介绍清楚元组,老王也没把握...

1. 什么是元组?

元组与列表非常类似,最大的一点区别就是元组是不可修改的,所以你可以叫它只读列表(关于只读特性,后面会详细讲)。

元组的定义与列表类似,只不过列表用中括号[],而元组用小括号()

# 创建包含多个元素的元组
first_tuple = ("元素1", "元素2", "元素3")

# 创建空元组
empty_tuple = ()

# 创建只包含一个元素的元组
second_tuple = ("元素1",)

当创建只包含一个元素的元组时,在元素后面一定要跟一个逗号,如果你写成second_tuple = ("元素1"),**那么Python不会认为这是在定义元组,而是会把他当成一个加了小括号的字符串。**这种情况下,Python就会理所当然的想:你以为加个小括号我就不认识你了,你还是个普通字符串。

image-20210126225131004

2. 元组的常用操作

2.1 索引和切片

元组和列表一样,支持索引和切片。例如:

tup1 = ("张三", "李四", "王五", "赵六")

print(tup1[1])	# 输出元组第2个元素
print(tup1[-1])	# 输出元组最后1个元素
print(tup1[1:])	# 输出元组第2个元素,以及后面的所有元素

image-20210126225825929

2.2 遍历元组

tup1 = ("张三", "李四", "王五", "赵六")

# 遍历输出元组中的所有元素
for name in tup1:
    print(name)

image-20210126230027951

2.3 获取元组中元素个数len()

tup = ("张三", "李四", "王五", "赵六")
print(len(tup))

image-20210126230349238

2.4 元素查询:in,index(), count()

  • in: 判断某元素是否在元祖中
tup = ("张三", "李四", "王五", "赵六")

# 判断某元素是否在元祖中
if "张三" in tup:
    print("张三在元组中。")
else:
    print("张三不在元组中。")


image-20210126230739185

  • index(): 获取某个元素的索引
tup = ("张三", "李四", "王五", "赵六")

# 获取某个元素的索引
print(tup.index("李四"))

image-20210126230848954

注意:和列表一样,元组的index()也是从左侧开始查,然后返回查到的第一个符合条件的元素的索引。

  • count(): 统计某个元素在元祖中出现的次数
tup = ("张三", "李四", "王五", "赵六", "李四")

# 统计某个元素在元祖中出现的次数
print(tup.count("李四"))

image-20210126231257448

2.5 运算符:+ 和 *

  • 加号+

    元组虽然不能改变元素的值,但是可以用加号+将多个元组组合起来。

tup1 = (1, 2, 3)
tup2 = (4, 5, 6)

tup3 = tup1 + tup2
print(tup3)

image-20210126231659332

  • 乘号*

乘号*可以使某个元祖复制多次,例如:

tup1 = (1, 2, 3)
tup2 = tup1 * 4
print(tup2)

image-20210126231934441

2.6 元素最大值和最小值:max, min

tup = (2, 5, 7, 2, 4, 1)
print(max(tup))	# 输出最大的元素值
print(min(tup))	# 输出最小的元素值

image-20210126232202737

3. 元组的不可变特性

元组的不可变特性是指不可以改变元素的值。例如:

tup = (1, 2, 3, 4)

# 如果尝试将第一个元素的值该位100,则会出错
tup[0] = 100

image-20210126234247355

但有人可能举下面的例子:

tup = (1, 2, 3, 4)
print(tup)
tup = (100, 2, 3, 4)
print(tup)

image-20210126235729415

这么做看起来确实是改变了第一个元素的值,但实际上,其实它是重新创建了一个元组(100, 2, 3, 4),然后绑定到了tup上。

image-20210126235229376

然后,还有人可能会拿出下面这段代码:

tup = (1, 2, [3, 4, 5], 4)
print(tup)

tup[2][2] = 100
print(tup)

image-20210126235850391

诶,这不是元素的值被改变了吗?元组不是不能改变元素的值吗?

其实,元组元素的值并没有发生改变。在上面的例子中,元组的第一个元素值是1,第二个元素值是2,但是第三个元素是列表,所以Python将列表在内存中的地址作为第三个元素的值;第四个元素是4

image-20210127000728993

从元组的角度来讲,执行tup[2][2]=100时,元组第三个元组的值并没有改变,还是指向原来那个列表,只不过列表所在的内存中的值发生了改变。

举例来说,tup就向4个紧挨着放的小盒子,第一个盒子里放了个苹果,第二个盒子里放了桃,第三个盒子里放了个杯子(杯子里放了三个球),第四个盒子里放了个西瓜。我们执行tup[2][2]=100指令时,其实相当于把杯子里的一个球拿出来换掉了,但是第三个盒子里放的杯子没变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值