什么是列表:
列表(list)是Python以及其他语言中最常用到的数据结构之一。Python使用使用中括号 [ ] 来解析列表。列表是可变的(mutable)——可以改变列表的内容。
对应操作:
1 查([])
1 names_class2=['张三','李四','王五','赵六']
2
3 # print(names_class2[2])
4 # print(names_class2[0:3])
5 # print(names_class2[0:7])
6 # print(names_class2[-1])
7 # print(names_class2[2:3])
8 # print(names_class2[0:3:1])
9 # print(names_class2[3:0:-1])
10 # print(names_class2[:])
2 增(append,insert)
insert 方法用于将对象插入到列表中,而append方法则用于在列表末尾追加新的对象
1 names_class2.append('alex')
2 names_class2.insert(2,'alvin')
3 print(names_class2)
3 改(重新赋值)
1 names_class2=['张三','李四','王五','赵六']
2
3 names_class2[3]='赵七'
4 names_class2[0:2]=['wusir','alvin']
5 print(names_class2)
4 删(remove,del,pop)
1 names_class2.remove('alex')
2 del names_class2[0]
3 del names_class2
4 names_class2.pop()#注意,pop是有一个返回值的
5 其他操作
5.1 count
count 方法统计某个元素在列表中出现的次数:
>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2
>>> x = [[1,2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1,2])
1
5.2 extend
extend 方法可以在列表的末尾一次性追加另一个序列中的多个值。
1 >>> a = [1, 2, 3]
2 >>> b = [4, 5, 6]
3 >>> a.extend(b)
4 >>> a
5 [1, 2, 3, 4, 5, 6]
extend 方法修改了被扩展的列表,而原始的连接操作(+)则不然,它会返回一个全新的列表。
1 >>> a = [1, 2, 3]
2 >>> b = [4, 5, 6]
3 >>> a.extend(b)
4 >>> a
5 [1, 2, 3, 4, 5, 6]
6 >>>
7 >>> a + b
8 [1, 2, 3, 4, 5, 6, 4, 5, 6]
9 >>> a
10 [1, 2, 3, 4, 5, 6]
5.3 index
index 方法用于从列表中找出某个值第一个匹配项的索引位置:
names_class2.index('李四')
5.4 reverse
reverse 方法将列表中的元素反向存放。
names_class2.reverse()
print(names_class2)
5.5 sort
sort 方法用于在原位置对列表进行排序。
x = [4, 6, 2, 1, 7, 9]
x.sort()#x.sort(reverse=True)
5.6 深浅拷贝
现在,大家先不要理会什么是深浅拷贝,听我说,对于一个列表,我想复制一份怎么办呢?
肯定会有同学说,重新赋值呗:
names_class1=['张三','李四','王五','赵六']
names_class1_copy=['张三','李四','王五','赵六']
这是两块独立的内存空间
这也没问题,还是那句话,如果列表内容做够大,你真的可以要每一个元素都重新写一遍吗?当然不啦,所以列表里为我们内置了copy方法:
1 names_class1=['张三','李四','王五','赵六',[1,2,3]]
2 names_class1_copy=names_class1.copy()
3
4 names_class1[0]='zhangsan'
5 print(names_class1)
6 print(names_class1_copy)
7
8 ############
9 names_class1[4][2]=5
10 print(names_class1)
11 print(names_class1_copy)
12
13 #问题来了,为什么names_class1_copy,从这一点我们可以断定,这两个变量并不是完全独立的,那他们的关系是什么呢?为什么有的改变,有的不改变呢?
这里就涉及到我们要讲的深浅拷贝了:
1 #不可变数据类型:数字,字符串,元组 可变类型:列表,字典
2
3 # l=[2,2,3]
4 # print(id(l))
5 # l[0]=5
6 # print(id(l)) # 当你对可变类型进行修改时,比如这个列表对象l,它的内存地址不会变化,注意是这个列表对象l,不是它里面的元素
7 # # this is the most important
8 #
9 # s='alex'
10 # print(id(s)) #像字符串,列表,数字这些不可变数据类型,,是不能修改的,比如我想要一个'Alex'的字符串,只能重新创建一个'Alex'的对象,然后让指针只想这个新对象
11 #
12 # s[0]='e' #报错
13 # print(id(s))
14
15 #重点:浅拷贝
16 a=[[1,2],3,4]
17 b=a[:]#b=a.copy()
18
19 print(a,b)
20 print(id(a),id(b))
21 print('*************')
22 print('a[0]:',id(a[0]),'b[0]:',id(b[0]))
23 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0]))
24 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1]))
25 print('a[1]:',id(a[1]),'b[1]:',id(b[1]))
26 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))
27
28
29 print('___________________________________________')
30 b[0][0]=8
31
32 print(a,b)
33 print(id(a),id(b))
34 print('*************')
35 print('a[0]:',id(a[0]),'b[0]:',id(b[0]))
36 print('a[0][0]:',id(a[0][0]),'b[0][0]:',id(b[0][0]))
37 print('a[0][1]:',id(a[0][1]),'b[0][1]:',id(b[0][1]))
38 print('a[1]:',id(a[1]),'b[1]:',id(b[1]))
39 print('a[2]:',id(a[2]),'b[2]:',id(b[2]))<BR><BR><BR>#outcome
# [[1, 2], 3, 4] [[1, 2], 3, 4]
# 4331943624 4331943752
# *************
# a[0]: 4331611144 b[0]: 4331611144
# a[0][0]: 4297375104 b[0][0]: 4297375104
# a[0][1]: 4297375136 b[0][1]: 4297375136
# a[1]: 4297375168 b[1]: 4297375168
# a[2]: 4297375200 b[2]: 4297375200
# ___________________________________________
# [[8, 2], 3, 4] [[8, 2], 3, 4]
# 4331943624 4331943752
# *************
# a[0]: 4331611144 b[0]: 4331611144
# a[0][0]: 4297375328 b[0][0]: 4297375328
# a[0][1]: 4297375136 b[0][1]: 4297375136
# a[1]: 4297375168 b[1]: 4297375168
# a[2]: 4297375200 b[2]: 4297375200
那么怎么解释这样的一个结果呢?
再不懂,俺就没办法啦...