10 Python 数据类型 | 元组

0 阅读4分钟

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号 ( ),列表使用方括号 [ ]。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

tup-2020-10-27-10-26-2.png

 tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"   #  不需要括号也可以
 type(tup3)
<class 'tuple'>

创建空元组

tup1 = ()

元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:

>>> tup1 = (50)
>>> type(tup1)     # 不加逗号,类型为整型
<class 'int'>

>>> tup1 = (50,)
>>> type(tup1)     # 加上逗号,类型为元组
<class 'tuple'>

元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等。

py-tup-10-26.png

访问元组

元组可以使用下标索引来访问元组中的值,

#!/usr/bin/python3
 
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])
tup1[0]:  Google
tup2[1:5]:  (2, 3, 4, 5)

修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合

#!/usr/bin/python3
 
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
 
# 创建一个新的元组
tup3 = tup1 + tup2
print (tup3) # (12, 34.56, 'abc', 'xyz')

删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组

#!/usr/bin/python3
 
tup = ('Google', 'Runoob', 1997, 2000)
 
print (tup)
del tup
print ("删除后的元组 tup : ")
print (tup) # 异常

元组运算符

与字符串一样,元组之间可以使用 +、+=和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

# ========== 元组运算综合练习 ========== 
# 1. 长度 print("长度:", 
len((10, 20, 30))) # 3 

# 2. 拼接 a = (1, 2) 
b = (3, 4) 
print("拼接:", a + b) # (1,2,3,4) 

# 3. 复制
print("复制:", ("hello",) * 2) # ('hello', 'hello') 

# 4. 判断存在 
print("存在判断:", 2 in (1,2,3)) # True

# 5. 遍历 
print("遍历:", end="") 
for num in (1,2,3): 
    print(num, end=" ") # 1 2 3

元组索引,截取

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

元组:

tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')

py-tup-7.png

Python 表达式结果描述
tup[1]'Runoob'读取第二个元素
tup[-2]'Weibo'反向读取,读取倒数第二个元素
tup[1:]('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')截取元素,从第二个开始后的所有元素。
tup[1:4]('Runoob', 'Taobao', 'Wiki')截取元素,从第二个开始到第四个元素(索引为 3)。
>>> tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')
>>> tup[1]
'Runoob'
>>> tup[-2]
'Weibo'
>>> tup[1:]
('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1:4]
('Runoob', 'Taobao', 'Wiki')
>>>

元组内置函数

元组包含了以下内置函数

表达式结果说明
len((1,2,3))3元组长度
max((5,1,9))9最大元素
min((5,1,9))1最小元素
sum((1,2,3))6元素求和
tuple([1,2,3])(1,2,3)列表转元组
sorted((3,1,2))[1,2,3]排序,返回列表
t = (5, 2, 8, 2, 9) 
print(len(t)) # 5 
print(max(t)) # 9 
print(min(t)) # 2 
print(sum(t)) # 26 
print(t.count(2))# 2 
print(t.index(8))# 2 
print(sorted(t)) # [2, 2, 5, 8, 9]

tuple 是不可变类型,方法很少,就两个count、index

t = (1, 2, 2, 3) print(t.count(2)) # 2

t = ('a', 'b', 'c') print(t.index('b')) # 1

元组不可变 = 元组里存的 “引用地址” 不能改 ≠ 里面的对象本身不能变

1. 内存层面的理解

你可以把元组想象成一个固定编号的小柜子

  • 柜子里每个格子,存的是指向某个东西的地址
  • 所谓 “不可变”,就是:柜子的编号不能变、格子不能增删、地址不能换
  • 但:地址指向的那个东西本身,是可以变的!
t = (10, 20, 'abc')
t[0] = 999 # 报错!不能改地址 
t.append(30) # 报错!不能加 
del t[1] # 报错!不能删
a = [1, 2] b = [3, 4] t = (a, b)

现在:

  • t 里存的是两个列表的地址
  • 地址不能变
  • 但列表内容可以变
a.append(999) print(t) # 输出:([1, 2, 999], [3, 4])

元组没变!它依然指向那两个列表。只是列表自己内容变了。

这就是:元组不可变 ≠ 元组内部的对象不可变