首先看一个问题:
>>> a = [1,2,4,6,8] >>> b = a >>> c = a[::] #列表的切片 >>> a[0] = 5那么a , b , c 分别等于多少?
怎么感觉b是个‘墙头草’,a去哪它就去哪? 我们来看一下a, b, c 的内存地址:
>>> id(a) 59763528 >>> id(b) 59763528 >>> id(c) 59797704可以发现a, b的内存地址是一样的,所以对a进行修改相当于也改了b 其实,他两是指向一个东西,只是有两个不同的标签(a,b)而已!
所以对列表的copy不能使用 ‘=’ 赋值语句,需使用切片
此时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]] >>>这样就可以啦!
