首先看一个问题:
>>> a = [1,2,4,6,8]
>>> b = a
>>> c = a[::] #列表的切片
>>> a[0] = 5
那么a , b , c 分别等于多少?
结果如下:
>>> a
[5, 2, 4, 6, 8]
>>> b
[5, 2, 4, 6, 8]
>>> c
[1, 2, 4, 6, 8]
怎么感觉b是个‘墙头草’,a去哪它就去哪?
我们来看一下a, b, c 的内存地址:
>>> id(a)
59763528
>>> id(b)
59763528
>>> id(c)
59797704
可以发现a, b的内存地址是一样的,所以对a进行修改相当于也改了b
其实,他两是指向一个东西,只是有两个不同的标签(a,b)而已!
所以对列表的copy不能使用 ‘=’ 赋值语句,需使用切片
再看一个问题:
>>> x = [1, 3, 5, [2, 3]]
>>> y = x[::]
>>> x[0] = 3
此时x, y等于多少呢?
你想的没错,是不一样:
>>> x
[3, 3, 5, [2, 3]]
>>> y
[1, 3, 5, [2, 3]]
那继续,这样呢:
>>> z = x[::]
>>> x[3].append(9) #将元素9添加至列表x尾部
此时z等于多少呢?
>>> x
[3, 3, 5, [2, 3, 9]]
>>> z
[3, 3, 5, [2, 3, 9]]
哈哈,猜错了吧!z竟然等于x
这又是为什么呢?
其实切片是一种浅复制:只能拷贝父对象,不会拷贝对象的内部的子对象
[2, 3, 9]作为[3, 3, 5, [2, 3, 9]]的子对象,浅复制是不能copy的
所以此时应该使用深拷贝(deepcopy)
>>> import copy
>>> w = copy.deepcopy(x)
>>> x[3].append(11) #将元素11添加至列表x尾部
>>> x
[1, 3, 5, [2, 3, 11]]
>>> w
[1, 3, 5, [2, 3]]
>>>
这样就可以啦!
*好了,今天的所学的一些小东西就分享给大家了,欢迎一起学习交流!*
下面对列表的一些方法做些介绍:
方法 | 说明 |
---|---|
lst.append(x) | 将元素x添加至列表lst尾部 |
lst.extend(L) | 将列表L中所有元素添加至列表lst尾部 |
lst.insert(index, x) | 在列表lst指定位置index处添加元素x,该位置后面的所有元素后移一个位置 |
lst.remove(x) | 在列表lst中删除首次出现的指定元素,该元素之后的所有元素前移一个位置 |
lst.pop([index]) | 删除并返回列表lst中下标为index(默认为-1)的元素 |
lst.clear() | 删除列表lst中所有元素,但保留列表对象 |
lst.index(x) | 返回列表lst中第一个值为x的元素的下标,若不存在值为x的元素则抛出异常 |
lst.count(x) | 返回指定元素x在列表lst中的出现次数 |
lst.reverse() | 对列表lst所有元素进行逆序 |
lst.sort(key=None, reverse=False) | 对列表lst中的元素进行排序,key用来指定排序依据,reverse决定升序(False),还是降序(True) |
lst.copy() | 返回列表lst的浅复制 |