0.序列指什么?
序列类型是指容器内的元素从0开始的索引顺序访问,一次可以访问一个或者多个元素,包括字符串(string)、元组(tuple)、列表(list):
The difference between tuple and list:
Tuple would not be changed, but list would.
>>> a = (1,2,3) >>> b = [1,2,3] >>> b.append(4) >>> a.append(4) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'tuple' object has no attribute 'append'
1.什么是拷贝?Copy操作意味着两个在内存中不同的对象,所以对应的id也是不一样的。为什么tuple的id没有变化而list的tuple发生了变化了呢?这个是由于Python解释器的实现导致的,由于tuple是immutable的,所以说没有必要在内存里维护多个一样字面意义的tuple,因此Python对于Tuple的Copy操作,实际上是增加了一个Reference Count而已,并没有做真正的Copy,所以ID的返回值是一样的。>>> ls1 = [1,2,3] >>> ls2 = ls1[:] >>> id(ls1),id(ls2) (140439195044104, 140439195058760) >>> tp1 = (1,2,3) >>> tp2 = ls1[:] >>> id(tp1),id(tp2) (140439194958816, 140439194958816)
这是浅拷贝还是深拷贝?
一般以下所得到的都是浅拷贝:
2.什么是浅拷贝?浅拷贝是指当序列中包含容器时,拷贝后新序列的容器只是原序列容器的引用>>> a = (1,3,5,[2,4]) >>> b = a[:] >>> b[3].append(6) >>> a,b ((1, 3, 5, [2, 4, 6]), (1, 3, 5, [2, 4, 6]))
3.什么是深拷贝?深拷贝是指拷贝后序列中的容器也拷贝过去,而不存在引用关系。>>> c = copy.deepcopy(a) >>> c[3].append(8) >>> a,c ((1, 3, 5, [2, 4, 6]), (1, 3, 5, [2, 4, 6, 8]))
4.总结:
考察是不是浅拷贝的方法是两者的容器是否指向同一个地址。