廖雪峰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(indelem),向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与内存之间的事儿吧~

posted @ 2021-08-26 10:47  靖许Philostratus  阅读(262)  评论(0)    收藏  举报