在python中,当运行上面的代码时,如果a是字典或者列表的话,程序执行的操作并不是新建一个b变量,然后a的值复制给b,而是新建一个b变量,把b的值指向a,也就是相当于在c语言里面的新建一个指向a的指针。
所以当a的值发生改变时,b的值会相应改变。
但是,当我们想新建一个与a的值相等的b变量,同时b的值与a的值没有关联时,要怎么做?这时就用到copy与deepcopy了
1 import copy
2
3 a=[1,2,3]
4 b=a
5 a.append(4)
6 print a,b
7
8 a=[1,2,3]
9 b=copy.copy(a)
10 a.append(4)
11 print a,b
上面的输出为:
1 [1, 2, 3, 4] [1, 2, 3, 4] 2 [1, 2, 3, 4] [1, 2, 3]
这里用了copy来让b与a相等,后面如果修改了a的值,b的值并不会改变。看来copy已经可以实现我们上面的提到的需求了,那么deepcopy又有什么用?
如果我们遇到这种情况,copy就解决不了了
1 a=[1,[1,2],3] 2 b=copy.copy(a) 3 a[1].append(4) 4 print a,b
这里输出的结果为:[1, [1, 2, 4], 3] [1, [1, 2, 4], 3] ,这样的结果明显不是我们想要的
当列表或字典参数里面的值是列表或字典时,copy并不会复制参数里面的列表或字典,这时就要用到deepcopy了
1 a=[1,[1,2],3] 2 b=copy.deepcopy(a) 3 a[1].append(4) 4 print a,b
输出的结果为:[1, [1, 2, 4], 3] [1, [1, 2], 3]