Python copy和deepcopy

面试总是问,所以记录一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
import copy
#分别查看赋值,copy,deepcopy和切片
a = [1,2,3,4,5,[6,7]]
print '原始的a\t\t',a,'\t',id(a)
b = a
c = copy.copy(a)
d = copy.deepcopy(a)
e = a[:]
#更改原始a
a.append('BINGO!')
a[5].append('BINGO!')
#输出显示
print '改变的a\t\t',a,'\t',id(a)
print '赋值操作\t',b,'\t',id(b)
print 'copy操作\t',c,'\t',id(c)
print 'deepcopy\t',d,'\t',id(d)
print '切片操作\t',e,'\t',id(e)

赋值 的操作,ID是一样的;
deepcopy 会保留最初始的a的信息,包括a的子对象(内嵌的list);
切片copy 相同,子对象的信息会和原始列表a保持一致,也就是说会随之改变。

1
2
3
4
5
6
原始的a [1, 2, 3, 4, 5, [6, 7]] 4303299432
改变的a [1, 2, 3, 4, 5, [6, 7, 'BINGO!'], 'BINGO!'] 4303299432
赋值操作 [1, 2, 3, 4, 5, [6, 7, 'BINGO!'], 'BINGO!'] 4303299432
copy操作 [1, 2, 3, 4, 5, [6, 7, 'BINGO!']] 4303300944
deepcopy [1, 2, 3, 4, 5, [6, 7]] 4303300800
切片操作 [1, 2, 3, 4, 5, [6, 7, 'BINGO!']] 4303301160