关于Python列表你可能会忽略的8个知识点

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. extendappend的区别

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的参数传递对于可变对象实际上是引用传递。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值