廖雪峰Python教程知识点归纳整理(3):list与tuple
本文转载请注明出处:
本文整理自:https://www.liaoxuefeng.com/wiki/1016959663602400/1017092876846880
list
中文名:列表。按字面意思即可理解。有序序列,且长度可变。
list的定义
用[ ]扩起若干个值,即得到一个list。这些值被称作list的元素(element)。将该list赋值给一个变量,即可将其保存下来(但不是总需要这样做):
classmates = ['Adam', 'Bob', 'Cathy']
Python在显示list的时候,与在代码中定义list的语法相同:
>>> classmates ['Adam', 'Bob', 'Cathy'] >>> print(classmates) ['Adam', 'Bob', 'Cathy']
特殊地,[]表示一个空的list:
>>> L = [] >>> L []
获取list长度
用len()可获取list的长度,即list中元素的个数:
>>> len(classmates) 3 >>> len(L) 0
空list的长度为0。
用索引访问list的元素
索引(index)即元素在一个有序序列中的位置。list即为有序序列,所以可用索引。Python与C系语言相同,索引从0开始(0、1、2、3、……)。
可以用索引取得list中位于该位置的元素,格式为lis[ind],其中lis表示一个list,ind表示目标索引:
>>> classmates[0] 'Adam' >>> classmates[1] 'Bob' >>> classmates[2] 'Cathy'
Python还支持负数索引。-1表示最后一个索引,-2表示倒数第2个,以此类推。
>>> classmates[-1] 'Cathy' >>> classmates[-2] 'Bob' >>> classmates[-3] 'Adam'
注意索引不要越界,否则会引发错误(IndexError)。
表达式lis[ind]可以像变量一样被使用,因此,可以像下面这样,替换指定索引处的元素:
>>> classmates[2] = 'George' >>> classmates ['Adam', 'Bob', 'George']
向list中添加元素
可以用方法append(elem),向list末尾追加元素elem:
>>> classmates.append('Dean') >>> classmates ['Adam', 'Bob', 'George', 'Dean']
可以用方法insert(ind, elem),向list的原先索引为ind的位置添加元素elem:
>>> classmates.insert(1, 'Elena') >>> classmates ['Adam', 'Elena', 'Bob', 'George', 'Dean']
⚠ “原先”一词很重要。对于正数索引没什么所谓,但对于负数索引,这个词的作用就显现出来了。比方说,如果ind取-1,它并不表示将元素追加到list末尾(那是append()干的事情),而是将其插入到原先索引为-1的位置处(而原先索引为-1的元素——即最后一个元素——向后挪一个位置),即插入完毕后它将处于倒数第2个位置处:
>>> classmates.insert(-1, 'Fred') >>> classmates ['Adam', 'Elena', 'Bob', 'George', 'Fred', 'Dean']
删除list中的元素
可以用方法pop(),删除list末尾的元素:
>>> classmates.pop() 'Dean' >>> classmates ['Adam', 'Elena', 'Bob', 'George', 'Fred']
可以用方法pop(ind),删除索引为ind的元素:
>>> classmates.pop(1) 'Elena' >>> classmates ['Adam', 'Bob', 'George', 'Fred']
值得一提的是,pop()(不管有没有参数)除了会从list中删除一个元素以外,还会返回那个被删除了的元素(从上面两次调用pop()后Python解释器所显示的结果即可看出)。可以用一个变量将这个值接上:
>>> popped = classmates.pop() >>> popped 'Fred' >>> classmates ['Adam', 'Bob', 'George']
也可以用del来删除指定的元素,这样做不返回任何值:
>>> del classmates[0] >>> classmates ['Bob', 'George']
此外,还可以用remove(val)来删除list中值为val的元素:
>>> classmates.remove('Bob') >>> classmates ['George']
但注意,remove()调用一次,只能删掉一个值为val的元素:
>>> L = [1, 2, 1, 3, 5] >>> L.remove(1) >>> L [2, 1, 3, 5]
Misc
list中的元素类型可以不同:
L = ['Apple', 123, True]
list的元素可以是另一个list:
s = ['python', 'java', ['asp', 'php'], 'scheme']
但注意,这里['asp', 'php']只算一个元素(只是类型为list),这一点在调用len()的时候就能看出来:
>>> s = ['python', 'java', ['asp', 'php'], 'scheme'] >>> len(s) 4
多次使用[ind]语法,即可拿到被嵌套在其中的list的元素:
>>> s[2][0] 'asp' >>> s[2][1] 'php'
这样的嵌套方式可以视为二维数组(第一和第二个索引分别是一个维度)。事实上,s[2][0]应该被理解为(s[2])[0],而s[2]即为['asp', 'php'],对其使用[0]即可获得'asp'。还可以继续嵌套(这样就有多维数组),只是那会比较少见。
最后最后,注意一个小点:只有一个元素的list和该元素自身是不一样的。如['George']和'George',前者是list,后者是str,二者是应当被严格地区分开来的。
补充:与C++的联系
Python的list大致相当于C++的vector,但每个元素的类型可以不同,C++则要求必须相同。
此外,在Python中,“默认”的充当数组的类型就是list,而在这一意义上,C++的对应物——数组(array),除了每个元素类型要相同之外,长度也是固定的,元素不能加也不能删。
tuple
中文名:元组。与list相似,也是有序序列,但(定义之后)元素不可更改。
tuple的定义
使用( )来定义tuple:
classmates = ('Adam', 'Bob', 'Cathy')
使用空的()来定义空tuple(虽然我看不出这样做有什么意义):
t = ()
但注意,如果要定义含1个元素的tuple,应使用(elem,)——注意那个逗号:
t = (0,)
这是因为如果不含那个逗号,即写成(elem),()会被Python理解为数学上的小括号(虽然一个这样的小括号在数学上是多余的),进而理解为elem这一表达式,于是t就不是tuple而是elem的类型了。
对于tuple,能做和不能做的操作
tuple类似于list,因而具有list的许多特性。但不同的是,那些能够修改list的操作,tuple统统没有,或不允许;其他的操作,tuple则有。
tuple的注意事项:“不可变”究竟怎么理解?
注意,我们虽然说tuple“不可变”,但这里的“不可变”,指的是每个元素自身的指向不变。但如果该元素内又有其他元素,其他元素的值(即指向)则是可变的。请看:
>>> t = (0, 1, [2, 3], 4) >>> t[2] = [5, 6] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> t[2][0] = 5 >>> t[2][1] = 6 >>> t (0, 1, [5, 6], 4)
将t[2]整个list改换掉的操作失败了,因为这样,tuple中的元素t[2]的指向就变了,那样会直接创建一个新的list并让t[2]指向它;但t[2]内又包含2个元素,直接修改这2个元素,则是允许的,因为修改它们时,虽然t[2][0]和t[2][1]的指向变了,但t[2]的指向并没有变,它还是指向原来那个list(也没有创建新list),只是那个list的内容变了(即内部的元素的指向变了)。元素层面上的操作不会导致list被整个换掉,但list层面上的则会。
好吧,这或许会有些难以理解,我也不方便说太多。有空来再仔细研究一下Python与内存之间的事儿吧~
浙公网安备 33010602011771号