除了列表,元组也是python语言提供的内置数据结构之一
元组和列表的主要区别:
- 元组用小括号表示,列表用中括号表示
t = ('python', 18, True)
print(t) # ('python', 18, True)
# 小括号是可以省略的
t = 'python', 18, True
print(t) # ('python', 18, True)
# 空元组的两种表示方式
print(()) # ()
print(tuple()) # ()
- 元组是不可变类型,列表是可变类型
# 一旦创建了不可变类型的对象,对象内部的所有数据就不能被修改了,这样就避免了由于修改数据导致的错误。此外,对于不可变类型的对象,在多任务环境下同时操作对象时不需要加锁。因此,在程序中尽量使用不可变类型对象
t = ('python', 18, True)
# t[1] = 'Java' # TypeError: 'tuple' object does not support item assignment
# 对于元组中可变类型的数据,元组中存储的是其引用(在内存中的地址),因此,存储的引用是不能改变的。但是,引用所指向的可变类型的数据是可以改变的
t = (5, [1, 3], 8)
t[1][0] = 7
print(t) # (5, [7, 3], 8)
只包含一个元素的元组
# 元组中至少包括一个逗号,即使只有一个元素。否则,小括号会被看作是数学公式中的小括号
t = (18)
print(t) # 18
print(type(t)) # <class 'int'>
t = (18,)
k = 18,
print(t, k) # (18,) (18,)
print(type(t), type(k)) # <class 'tuple'> <class 'tuple'>
多个变量同时赋值
# 赋值运算符的左边可以是一个所有元素都为变量的元组或列表,从而一次给多个变量同时赋值
a, b = [5, 8]
print(a, b) # 5 8
[a, b] = [5, 8]
print(a, b) # 5 8
a, b = 5, 8
print(a, b) # 5 8
# 赋值预算符左右两边的元素个数必须是相同的,否则会抛出 ValueError
# a, b = 5, 8, 3 # ValueError: too many values to unpack (expected 2)
# 可以在赋值运算符左边的某个变量前添加 * ,以匹配赋值运算符右边的 0 个或多个元素
a, *b, c = 1, 2, 3, 4
print(a, b, c) # 1 [2, 3] 4
a, b, *c = 1, 2, 3, 4
print(a, b, c) # 1 2 [3, 4]
*a, b, c = 1, 2, 3, 4
print(a, b, c) # [1, 2] 3 4
a, *b, c = 1, 2
print(a, b, c) # 1 [] 2
# 赋值运算符的左右两边都是元组,左边是变量的元组,右边是表达式的元组
# 先将右边的所有表达式都计算完毕后,再分别赋值给左边的变量
a = 5
b = 8
a, b = b, a
print(a, b) # 8 5