Python - copy 拷贝模块
目录
内置模块 copy
深浅拷贝
- 对于不可变对象(数字,字符串,元组等),深浅拷贝等同于赋值操作 (v2 = copy(v1),等同于 v2 = deepcopy(v1),等同于v2 = v1。
- 对于可变的对象(列表,字典,集合等)深浅拷贝的本质是,申请新的空闲内存单元,并将变量名指向该内存单元的首地址,但浅拷贝内部元素的地址指向不变,深拷贝内部元素的地址指向变化
# 注意:由于拷贝对于不可变对象等同于赋值操作,所以你会发现列表中的不可变元素无论深浅拷贝地址指向不变
# 浅拷贝-方式一: [:]
>>> l1 = [['5', '2', '1'], ['1', '3', '1', '4']]
>>> id(l1)
4401079144
>>> map(id, l1)
[4401099336, 4401100056]
>>> l2 = l1[:]
>>> id(l2)
4401085328
>>> map(id, l2)
[4401099336, 4401100056]
# 浅拷贝方式二: copy.copy(x)
>>> import copy
>>> l1 = [['5', '2', '1'], ['1', '3', '1', '4']]
>>> id(l1)
4401085040
>>> map(id, l1)
[4401079144, 4401083672]
>>> l2 = copy.copy(l1)
>>> id(l2)
4402468120
>>> map(id, l2)
[4401079144, 4401083672]
# 深拷贝方式一: copy.deepcopy(x, memo=None, _nil=[])
>>> import copy
>>> l1 = [['5', '2', '1'], ['1', '3', '1', '4']]
>>> id(l1)
4402559960
>>> map(id, l1)
[4402560248, 4401062328]
>>> l2 = copy.deepcopy(l1)
>>> id(l2)
4401072536
>>> map(id, l2)
[4401100344, 4401101136]
- 深浅拷贝的应用场景在于模版化,如模拟ZABBIX模版,主机/主机组应用并可自定义模版参数,但并不影响源模版
>>> import copy
>>> a = '123'
>>> y = copy.copy(a) # 浅拷贝
>>> id(a)
4322676048
>>> id(y)
4322676048
>>> y = copy.deepcopy(a) # 深拷贝,和浅拷贝效果一样
>>> id(y)
4322676048
>>> l = ['1','2','3']
>>> x = copy.copy(l)
>>> id(l)
4322239336
>>> id(x)
4322239120
>>> id(l[0])
4320359368
>>> id(x[0])
4320359368
>>> x = copy.deepcopy(l)
>>> id(x)
4322237544
>>> id(l)
4322239336
>>> id(x[0])
4320359368
>>> id(l[0])
4320359368
当列表中存在可变对象时,深拷贝后,可变对象地址会被改变
>>> l = ['1','2','3',['1','2']]
>>> x = copy.deepcopy(l)
>>> id(x)
4322239336
>>> id(l)
4322213040
>>> id(x[0]) # 可变对象元素相同
4320359368
>>> id(l[0])
4320359368
>>> id(x[-1]) # 这是一个可变元素
4322213688
>>> id(l[-1])
4322239120
>>> x = copy.copy(l) # 浅拷贝,地址都相同
>>> id(l[-1])
4322239120
>>> id(x[-1])
4322239120