组合数据对象
- 数据除了三大基本类型int、float、complex外,还有组合数据类型,它们的对象称为组合数据对象。
- 一个组合数据对象中可以包含多个成员对象(成员、元素)。
- 组合对象可作为整体使用,可赋给变量、传入或传出函数,或作为成员构造更大的组合对象,还可取出其中成员单独使用。
- 重要的组合数据对象有:字符串(str)、列表(list)、元组(tuple)、字典(dict)、集合(set和frozenset)等。
本次主要记录列表(list)。
概念
-
列表是一批成员的顺序组合,格式为a[‘xxx’,‘xxx’,…]。
-
列表成员可以是任意类型对象,包括各种组合数据对象。
-
列表可以为空,即没有元素,用一对方括号 [ ] 进行表示,称为空表。
-
列表中的每个成员都有确定的位置,这个位置称为下标,与字符串相同。两者区别在于,字符串通过下标确认某个字符位置,而列表通过下标确认某个成员的位置。如:
a = 'hello' print(a[3]) #输出结果为l b = [1, 2.0, 'hello', [ ], {1, 'a'}, ['aaa'], 1+2j] print(b[2]) #输出结果为hello
-
表(对象)可作为变量的值,也可作为函数的实际参数和返回值。程序里可通过变量和函数实现对表对象的操作。如:
a1 = [1, 'Math', 89.7] a2 = ['Beijing', 'Shanghai', 'Tianjin', 'Chongqing'] b1 = [sin(1.0), cos(1.0), tan(1.0)] #将列表对象成员赋值给变量x、y x = a1[1] y = a2[0] print(a1,a2) #[1, 'Math', 89.7] ['Beijing', 'Shanghai', 'Tianjin', 'Chongqing'] print(x,y) #Math Beijing z = x + y #x,y相加返回一个z print(z) #MathBeijing
列表和字符串的区别
-
字符串通过下标确认某个字符位置,而列表通过下标确认某个成员的位置。这部分在前面演示过,不做重复。
-
在字符串中,其内容不可被改变,而在列表中,其内容可变。即不可变与可变类型。当改变两者的内容,即其value值,字符串的id也会发生改变,而列表的id不变。如以下代码:
str1 = 'hello' print(id(str1)) #str1的地址id是2410226145392 str2 = str1 print(id(str2)) #str2的地址id也是2410226145392,这意味着str1和str2在内存空间被分配了同一个地址 str1 = str1.replace('e', 'w', 1) print(str1) #hwllo,此时我们可以看做str1发生了改变 print(str2) #hello,str2没有发生改变 print(id(str1)) #再次查看str1的地址id,为2311221879088 print(id(str2)) #str2的地址id没有改变,为2410226145392 #上面的变化告诉我们,当我们改变str1,即字符串的value值时,实际上是销毁原字符串的地址id, # 同时销毁原来的字符串,在内存空间开辟一块新的地址id,创建新的字符串, #而不是上面所说的str1发生了改变,所以说字符串是不可变类型 list1 = [1,2,3,45,6] print(id(list1)) # list1的地址id是3216674332352 list2 = list1 print(id(list2)) # list2的地址id是3216674332352 list1.append('dd') print(list1) #[1, 2, 3, 45, 6, 'dd'] print(list2) #[1, 2, 3, 45, 6, 'dd']list1和list2的value都发生了改变 print(id(list1)) #list1的地址id是3216674332352 print(id(list2)) #list2的地址id是3216674332352 # 从上面可以看出,列表在内存空间的地址id改变value的前后没有发生改变 # 也就是说它是在原来的位置改变自身,并没有销毁自己,所以说列表是可变类型
类似的可变与不可变类型还有以下几种:
-
可变(mutable):字典型(dictionary)、列表型(list)
-
不可变(immutable):int、字符串(string)、float、(数值型number)、元组(tuple)
根据可变数据类型与不可变数据类型的概念,只需要在改变value值的同时,使用id()函数查看变量id值是否变化,就可以知道这种数据类型是可变的还是不可变的了。