列表实战——就地改变列表——其它常见的列表操作 | 第二部分 类型与操作 —— 第 8 章: 列表和字典 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
因为列表可变,可以使用 del
语句来就地删除项或区间:
>>> l = ['spam', 'eggs', 'ham', 'toast']
>>> del l[0] # delete one item
>>> l
['eggs', 'ham', 'toast']
>>> del l[1:] # delete an entire section
>>> l # same as l[1:] = []
['eggs']
之前见过了:因为切片赋值是删除操作加上插入操作,所以还可以通过将一个空列表赋值给一个切片来删除列表的一个区间(l[i:j] = []
);python删除了左边的区间,然后什么也没插入。
另一方面,将空列表赋值给一个索引,只会在指定插入点储存一个到这个空列表对象的应用,而非删除一项:
>>> l = ['already', 'got', 'one']
>>> l[1:] = []
>>> l
['already']
>>> l[0] = []
>>> l
[[]]
虽然刚才讨论的所有操作都是典型的,但可能还有一些额外的列表方法和操作没有在这里展示。比如,方法集可以随时间而改变,事实上在python 3.3中已经改变了——它的新的 l.copy()
方法创建了列表的一个顶层拷贝,非常像 l[:]
和 list(l)
,但和sets和字典中的 copy
是对称的:
# list
original_list = [1, 2, 3, 4]
copied_list = original_list.copy()
copied_list.append(5)
# set
original_set = {1, 2, 3, 4}
copied_set = original_set.copy()
copied_set.add(5)
# dictionary
original_dict = {"a": 1, "b": 2, "c": 3}
copied_dict = original_dict.copy()
copied_dict["d"] = 4
# print results
print("original list:", original_list) # output: original list: [1, 2, 3, 4]
print("copied list:", copied_list) # output: copied list: [1, 2, 3, 4, 5]
print("original set:", original_set) # output: original set: {1, 2, 3, 4}
print("copied set:", copied_set) # output: copied set: {1, 2, 3, 4, 5}
print("original dict:", original_dict) # output: original dict: {'a': 1, 'b': 2, 'c': 3}
print("copied dict:", copied_dict) # output: copied dict: {'a': 1, 'b': 2, 'c': 3, 'd': 4}
要获得全面及时的类型工具列表,应该总是参考python手册,python的 dir
和 help
函数(在第4章首次见过),或在前言提到过的参考书之一。
并且因为它是如此常见的一个难题,我还想再次提醒你:这里讨论的所有就地修改操作都只适用于可变对象:不管有多努力的尝试,都不适用于字符串(或在第9章中讨论的元组)。可变性是每个对象类型的内在属性。