>>> a = [1,2,3,‘a‘,‘b‘,‘c‘] >>> >>> b = a >>> b [1, 2, 3, ‘a‘, ‘b‘, ‘c‘] >>> a [1, 2, 3, ‘a‘, ‘b‘, ‘c‘] >>> >>> id(a) 139845710543400 >>> id(b) 139845710543400
>>> a.append(‘d‘) 因为b和a指向的是同一个地址空间,所以我们在改变a的时候b也会改变
>>> a [1, 2, 3, ‘a‘, ‘b‘, ‘c‘, ‘d‘] >>> b [1, 2, 3, ‘a‘, ‘b‘, ‘c‘, ‘d‘]
>>> b.append(4) 我们去改变b也是同样的道理
>>> b [1, 2, 3, ‘a‘, ‘b‘, ‘c‘, ‘d‘, 4] >>> a
[1, 2, 3, ‘a‘, ‘b‘, ‘c‘, ‘d‘, 4]
下面我们来看一下如何实现拷贝
>>> import copy 首先我们要导入一个copy模块
>>> >>> a = [1,2,3,[‘a‘,‘b‘,‘c‘]] >>> b=a >>>
>>> c = copy.copy(a) 调用copy这个模块里面的copy方法
>>> b [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] >>> c [1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] >>> id(a) 139845710626400 >>> id(b) 139845710626400
>>> id(c) 由于c是copy过来的,所以它的地址空间和a是不同的
139845710722040
>>> a.append(‘d‘) 然后我们通过给a里面增加一个值,看看c是否改变
>>> a [1, 2, 3, [‘a‘, ‘b‘, ‘c‘], ‘d‘] >>> b [1, 2, 3, [‘a‘, ‘b‘, ‘c‘], ‘d‘] >>> c
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 在这里我们发现c列表里面的值没有改变,这里的拷贝就是一个浅拷贝,只拷贝父对象
>>> id(a[0]) 但是我们会发现a和c里面的元素还是指向同一个空间的
16290136 >>> id(c[0])
16290136
下面让我们看一下拷贝的时候的内存空间的分配:
>>> a[3].append(‘d‘) 我们来测试,改变a里面的元素,看看c元素是否改变
>>> a [1, 2, 3, [‘a‘, ‘b‘, ‘c‘, ‘d‘], ‘d‘] >>> c
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘, ‘d‘]] 这里我们发现c里面的相应的元素也改变了
下面我们做一个深拷贝:
>>> d=copy.deepcopy(a)
>>> d
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘, ‘d‘], ‘d‘]
>>> id(a[3]) 我们来看看a和d中的一个元素的地址空间
139845710626688 >>> id(d[3]) 139845710721824 我们发现这时已经不是同一个地址空间了
>>> a.append(‘e‘) 我们再去测试给a增加一个元素,看看d是否有变化
>>> a [1, 2, 3, [‘a‘, ‘b‘, ‘c‘, ‘d‘], ‘d‘, ‘e‘] >>> d
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘, ‘d‘], ‘d‘] 我们可以看到d没有变化