1. 用切片来实现拷贝
切片是python中列表非常常见的操作,不仅仅可以用来“切割”列表,还可以优雅的对一个列表进行拷贝。
>>> a = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
>>> a[:]
['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
>>> a[:] is a
False
需要注意的是,这种拷贝只是浅拷贝。
>>> a = ['foo', 'bar', 'baz',[1,3,5]]
>>> a[:]
['foo', 'bar', 'baz', [1, 3, 5]]
>>> b = a[:]
>>> b.append('c')
>>> b
['foo', 'bar', 'baz', [1, 3, 5], 'c']
>>> b[3].append('d')
>>> b
['foo', 'bar', 'baz', [1, 3, 5, 'd'], 'c']
>>> a
['foo', 'bar', 'baz', [1, 3, 5, 'd']]
2. 用列表代替列表中的部分元素
>>> a = ['foo', 'bar', 'baz', 'chic', 'fox', 'cock']
>>> a[1:4]
['bar', 'baz', 'chic']
>>> a[1:4] = [1.1, 2.2, 3.3, 4.4, 5.5]
>>> a
['foo', 1.1, 2.2, 3.3, 4.4, 5.5, 'fox', 'cock']
3. 把一个列表插入到另一个列表,并替换掉插入位置的元素
>>> a = [1, 2, 3]
>>> a[1:2] = [0.1, 0.2, 0.3]
>>> a
[1, 0.1, 0.2, 0.3, 3]
注意被替换元素的序号与切片范围的关系
4. 从某个位置把一个列表插入到另一个列表,不替换任何元素
>>> a = [1, 2, 7, 8]
>>> a[2:2] = [3, 4, 5, 6]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8]
5. 批量删除列表中的元素
还是利用切片来实现
>>> a = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
>>> a[1:5] = []
>>> a
['foo', 'corge']
>>> a = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']
>>> del a[1:5]
>>> a
6. extend
和append
的区别
append(object)
是把参数object当作一个整体的对象加入到list的尾端
>>> a = ['a', 'b']
>>> x = a.append(123)
>>> print(x)
None
>>> a
['a', 'b', 123]
即使这个object是一个可迭代对象
>>> a = ['a', 'b']
>>> a.append([1, 2, 3])
>>> a
['a', 'b', [1, 2, 3]]
而extend
接受的参数是一个iterable
对象,然后把这个iterable
对象中的各个元素从尾端加入到列表中。
>>> a = ['a', 'b']
>>> a.extend([1, 2, 3])
>>> a
['a', 'b', 1, 2, 3]
7. List的多数方法返回值都是None
例如
a.append(<obj>)
a.extend(<iterable>)
a.insert(<index>, <obj>)
a.remove(<obj>)
除了pop
会返回弹出的那个值之前,上面的方法都是返回的None
.
8. 使用列表做方法的默认参数
列表属于mutable 的对象,用列表做方法的默认参数会出现与期望不符的结果
def add_end(L=[]):
L.append('END')
return L
#正常调用时:
>>> add_end([1, 2, 3])
[1, 2, 3, 'END']
>>> add_end(['x', 'y', 'z'])
['x', 'y', 'z', 'END']
#第一次通过默认参数调用时,也是正常的
>>> add_end()
['END']
#再次调用add_end()时,结果就不对了
>>> add_end()
['END', 'END']
>>> add_end()
['END', 'END', 'END']
这是因为默认参数L始终指向的同一个对象,而python的参数传递对于可变对象实际上是引用传递。