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


posted @ 2021-02-04 16:14  月思  阅读(120)  评论(0编辑  收藏  举报