2.7. 列表¶
列表(list)是可变的、有序的值序列。与字符串和字节不同,列表可以存放任意类型的值,并且你可以就地修改、添加或删除其中的元素。
2.7.1. 创建列表¶
方括号可创建一个列表字面量:
empty = []
nums = [1, 2, 3]
mixed = [1, "two", 3.0, True, None] # any types
nested = [[1, 2], [3, 4], [5, 6]] # lists of lists
list 构造函数可从任意可迭代对象构建列表:
>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]
2.7.2. 长度、索引和切片¶
len() 返回元素的数量。索引和切片的工作方式与字符串相同——位置从 0 开始,负索引从末尾倒数,超出有效范围的切片会静默裁剪而不引发错误:
>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
正索引从前往后计数;负索引从末尾倒数。¶
切片语法是 Python 在背后构建的 slice 对象的简写。nums[1:4] 等同于 nums[slice(1, 4)]。你很少手动构造切片对象,但 slice() 偶尔能用于将一个切片存储为值以便复用:
head = slice(0, 3)
print(nums[head]) # [10, 20, 30]
print(letters[head]) # first three letters, same slice
2.7.3. 修改列表¶
列表支持就地的索引赋值和切片赋值:
>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400] # slice can change the length
>>> nums
[99, 200, 300, 400]
最常用的列表方法:
list.append()—— 在末尾添加单个元素。list.extend()—— 追加可迭代对象中的每个元素。list.insert()—— 在指定位置插入。list.remove()—— 删除某个值的首次出现。list.pop()—— 删除并返回一个元素(默认为最后一个)。list.clear()—— 删除所有元素。list.sort()—— 就地排序。传入reverse=True可按降序排列。list.reverse()—— 就地反转。
>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]
这些方法会就地修改列表并返回 None。写成
nums = nums.sort() # nums is now None -- common bug
几乎永远不是你想要的;原来的 nums 确实被排序了,但随后的赋值又用返回值覆盖了这个名字。要么在单独一行调用 nums.sort(),要么使用内置的 sorted() 在不改动原列表的情况下取回一个新的已排序列表。
2.7.4. 运算符¶
+将两个列表拼接成一个新列表。*重复一个列表。in测试成员关系。
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True
2.7.5. 遍历列表¶
for 循环按顺序遍历各元素:
for n in [10, 20, 30]:
print(n)
2.7.6. 别名与修改¶
列表是内存中的单个值;多个名字可以指向同一个列表。通过一个名字进行的修改,对指向同一列表的其他每个名字都是可见的。
a 和 b 都指向同一个列表。通过任一名字进行修改,都会改变其他每个名字所看到的内容。¶
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4] # same object, change is visible
要制作一份独立的副本,可对整个列表切片或调用 list 构造函数:
>>> c = a[:] # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4] # c is unaffected
这只会复制顶层列表;嵌套的列表仍在原列表和副本之间共享。