元组(tuple)
元组是一个不可变的序列
其操作方式基本上和列表是一致的(唯一区别:元组不可变,列表可变)
在操作元组时,就把元组当做是一个不可改变的列表就ok了
一般希望数据不改变时,就使用元组,其余情况都使用列表
创建元组
用()创建
my_tuple = () # 创建了一个空元组
my_tuple = (1,2,3,4,5) # 创建了一个5个元素的元组
元组为不可变对象,一旦创建就不能改变
当元组为非空元组时,括号可以省略
例: my_tuple = 10,20,30,40,50
my_tuple = 10,20,
如果元组不是空元组,那么它里面至少要有一个逗号",",为的是跟整型区分开,如:
my_tuple = 30 ---> type(my_tuple)---> int
my_tuple = (30) ---> type(my_tuple)---> int
my_tuple = 30, ---> type(my_tuple)---> tuple
my_tuple = (30,) ---> type(my_tuple)---> tuple
元组的解包(解构)
解包:将元组当中的每一个元素分别赋值给一个变量
不仅仅有元组,其实序列都可以解包
例:my_tuple = 10,20,30,40
a,b,c,d = my_tuple
---> a=10, b=20, c=30, c=40
解包的应用:变量值互换
a = 100
b = 200
a, b = b, a --->即可实现变量值的互换
(其实等号右边的b,a 相当于省去括号的元组)
在对一个元组解包时,变量的数量必须和元组的元素数量一致
也可以在变量前边添加一个*,这样该变量将获取元组中所有剩余的元素
(剩下所有的元素将组成一个列表)
不能出现两个及以上带*的变量
例子: my_tuple = 10,20,30,40
a, b, *c = my_tuple ---> a = 10, b = 20, c= [30, 40]
a, *b, c = my_tuple ---> a = 10, b = [20, 30], c= 40
*a, b, c = my_tuple ---> a = [10, 20], b = 30, c= 40
可变对象
- 每个对象均包含三个部分:
id (标识) ---> id不可变
type (类型)
value (值) ---> 可变对象的value可以改变,不可变对象的value不可以改变
- 列表就是一个可变对象
a = [1, 2, 3]
- a[0] = 10 (改对象)
- 这个操作是在通过变量a去改变对象的值
- 这个操作不会改变变量a所指向的对象
- 当我们去修改对象时,若有其他变量也指向该对象,则对象的改变也在那些变量中体现
例:a = [1, 2, 3]
b = a # a和b均指向同一个对象
a[0] = 10 # 通过变量a去改变对象的值
---> a = [10, 2, 3] b = [10, 2, 3]
- a = [4, 5, 6] (改变量)
- 这个操作是在给变量重新赋值
- 这个操作改变了变量a所指向的对象
- 为一个变量赋值时,不会影响到其他变量(不管这些变量是否指向同一个对象)
== 和 is 的区别
== 和 != 比较的是对象的value(值)是否相等
is 和 is not 比较的是对象的id(内存地址)是否相等
(is 和 is not 要求更苛刻,即a == b并不意味a is b,但是 a is b 一定有 a == b)