概念

官方解释:Python中的赋值语句不复制对象,它们在目标和对象之间建立索引。对于可变项目或可变项目的集合,有时需要一个副本,以便可以更改一个副本而不更改其他副本。该模块提供通用的浅层和深层copy操作。

浅copy

为什么有赋值还要copy呢?当有一个需求是要把一个数据放到我的程序里进行修改操作,但是还要保持原始数据不变。这个时候就需要我们的copy登场了

先提一个需求,我的程序需要对一个数据进行修改,但是我又要保持这个数据和修改之前保持一致。那我们怎么操作呢?

举个例子:

import copy

a = ['111', '222']  # 我们不对变量a进行修改,因为要保持数据和修改之前一致
b = a
b[0] = '333'
print(a, b)
# ['333', '222'] ['333', '222'] 结果并没有达到我们的要求 # 手动copy
a = ['111', '222']
b = list()
for i in a:
b.append(i)
b[0] = '333'
# ['111', '222'] ['333', '222'] 实现了要求

# copy就是起到了这个作用
a = ['111', '222']
b = copy.copy(a)
c[0] = '333'
print(a, c)

从上面的例子可以看出引用和copy的区别,但是这还不够,看下面的例子:

深copy

a = ['111', '222', ['333', '444']]
b = copy.copy(a) b[2][0] = '555' print(a, b)
# ['111', '222', ['555', '444']] ['111', '222', ['555', '444']]
# 我们的目的又达不到了,如何是好 # 手动deep copy
a = ['111', '222', ['333', '444']] # 递归copy
def deep_copy(copy_list):
b = list()
for i in copy_list:
if isinstance(i, list):
i = deep_copy(i)
b.append(i)
return b b = deep_copy(a)
b[2][0][0] = '555'
print(a, b) a = ['111', '222', ['333', '444']]
b = copy.deepcopy(a)
b[2][0][0] = '555'
print(a, b)

从这个例子里可以看出来浅copy和深copy的区别:

浅copy:复制父对象,子对象仍然使用引用的方式。深copy:复制了对象和对象的所有子对象。

方法

copy.copy(x) 浅copy

copy.deepcopy(x) 深copy

浅copy和深copy的区别只与复合对象有关(对象包含其他对象,如列表或类实例)

浅copy构造了一个新的复合对象,然后(尽可能地)将原始对象的引用插入。

深copy构造了一个新的复合对象,然后递归地将原始对象的副本插入。

那么问题来了:递归的将原始对象的副本插入,如果这个列表的深度是无限的会怎么样?

show code time

a = ['111', '222', ['333', '444', ['555', '666']]]
a.append(a) def deep_copy(copy_list):
b = list()
for i in copy_list:
if isinstance(i, list):
if i is copy_list:
pass
else:
i = deep_copy(i)
if i is copy_list:
b.append(b)
else:
b.append(i)
return b c = deep_copy(a)
c[2][2][0] = '777'
print(a)
print(c)

  

  

最新文章

  1. 探索C#之微型MapReduce
  2. 开发中 常用 js 记录(一)
  3. Xcode 8 打印输出: Class PLBuildVersion is implemented in both...
  4. noi 8780 拦截导弹
  5. EXCEL工作表保护密码忘记了,如何撤消工作表保护?
  6. [数据库]SQL中Group By 的常见使用方法.
  7. 。。。HibernateTemplate与Session。。。
  8. Andoid 学习笔记 AppCompatEditText
  9. sql server 2008 评估期已过期
  10. Nexus Root Toolkit教程——刷机
  11. win server 2003 将MBR转为GPT突破硬盘2TB的限制(附微软磁盘科普)
  12. WebX框架学习笔记之一
  13. CSS3学习笔记--media query 响应式布局
  14. ztree 为节点添加点击触发事件
  15. [转]Linux中python3.6+ipython+Jupyter Notebook环境
  16. 细说tomcat之应用监控
  17. Sitecore开发 IP地理定位服务入门
  18. UI自动化(八)xpath
  19. 20165305 苏振龙《Java程序设计》第四周学习总结
  20. 乘风破浪:LeetCode真题_022_Generate Parentheses

热门文章

  1. noi.ac309 Mas的童年
  2. golang中使用mysql数据库
  3. virtualbox+ubuntu
  4. 51nod 1630(定积分 + 期望)
  5. 爬虫综合大作业——网易云音乐爬虫 & 数据可视化分析
  6. java eclipse中使用wsdl生成soap 的客户端代码
  7. Spring Cloud中关于Feign的常见问题总结
  8. DirectX11--深入理解与使用2D纹理资源
  9. ubuntu18系统美化
  10. numpy&pandas补充常用示例