Python浅拷贝与深拷贝

Python中拷贝

Python中的赋值号=并不是真正的拷贝,这仅仅是一个引用。参照这篇博客 。必要的时候,我们需要复制值,而不是使用引用。Python中有两种方式:浅拷贝深拷贝。

拷贝模块

在使用拷贝的时候,我们需要导入copy模块。比如:

import copy
copy.copy(x)  # 浅拷贝
copy.deepcopy(x)  # 深拷贝

浅拷贝(shallow copy)

浅拷贝创建一个新的存储原来对象元素的引用。因此,浅拷贝不会拷贝内嵌对象,它只会拷贝内嵌对象的引用。这意味着,一个拷贝过程不会递归或者创建内嵌对象本身的拷贝。

import copyold_list = [1,2,3,4,5]
new_list = copy.copy(old_list)# 两者输出相同的内容
print("Old list:", old_list)
print("New list:", new_list)# 两者不是一个对象
print(old_list is new_list)  # 输出False

但是,这两个list本身不相关。当在old_list尾部追加新的元素时,new_list的内容不会发生变化。比如:

import copyold_list=[1,2,3]
new_list=copy.copy(old_list)
old_list.append(4)
# 两者输出内容不同
print("Old list:",old_list)  # 1 2 3 4
print("New list:",new_list)  # 1 2 3# 只有旧的变化,数字是不可变元素
old_list[0]=0
print("Old list:",old_list)  # 0 2 3 4
print("New list:",new_list)  # 1 2 3# 只有新表变化,数字是不可变元素
new_list[0]=5
print("Old list:",old_list)  # 0 2 3 4
print("New list:",new_list)  # 5 2 3# 都变化
old_list.remove(2)
print("Old list:",old_list)  # 5 3 4
print("New list:",new_list)  # 5 3# 可变元素测试
class node:def __init__(self,n=0):self._n=nold_list=[node(0),node(1),node(2)]
new_list=copy.copy(old_list)old_list[0]._n=1
print("Old list[0]:",old_list[0]._n)  # 1
print("New list[0]:",new_list[0]._n)  # 1

由上述的例子可知,浅拷贝是拷贝的内嵌元素的引用;如果原来的元素增加新的元素,拷贝元素不变;如果改变两者任何一个可变的公共引用(即拷贝前的),那么元素都会发生变化;改变不可变元素的值,不会发生变化。
如果是复合对象,即递归的内嵌,那么只把最外层的视为内嵌的引用。直接上代码:

import copyold_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_list = copy.copy(old_list)old_list[1][1] = 'AA'print("Old list:", old_list)  # [[1, 1, 1], [2, 'AA', 2], [3, 3, 3]]
print("New list:", new_list)  # [[1, 1, 1], [2, 'AA', 2], [3, 3, 3]]

也就是说,这和node的那个一样,都是可变的。

深拷贝(deep copy)

深拷贝是一个递归的操作。可以把这个理解成真正意义上的“拷贝”操作。

import copyold_list = [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
new_list = copy.deepcopy(old_list)old_list[1][0] = 'BB'print("Old list:", old_list)  # [[1, 1, 1], ['BB', 2, 2], [3, 3, 3]]
print("New list:", new_list)  # [[1, 1, 1], ['BB', 2, 2], [3, 3, 3]]

总结:

浅拷贝拷贝引用,深拷贝是创建新对象。前者速度快、占用内存少,但是新旧对象有关联;后者虽然速度慢且耗内存,但是新旧对象之间没任何影响。

Python浅拷贝与深拷贝相关推荐

  1. Python 浅拷贝和深拷贝 - Python零基础入门教程

    目录 一.Python 浅拷贝和深拷贝前言 二.Python 普通的变量赋值 三.Python 浅拷贝和深拷贝 1.Python 浅拷贝 copy 2.Python 深拷贝 deepcopy 3.Py ...

  2. python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝

    Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...

  3. python——浅拷贝和深拷贝

    这一篇的内容主要是关于python中浅拷贝和深拷贝的原理.博主的其他内容可以在其他专栏中查看,更多内容还在更新中. 变量赋值的底层逻辑 变量赋值机制 num1 = [1,2,3] num2 = num ...

  4. Python浅拷贝、深拷贝与防止数据被篡改

    目录 一.概念解读 1.1.Python对象 1.2.可变与不可变对象 1.3.引用 二.逐步深入:引用赋值 2.1.不可变对象的引用赋值 三.主旨详解:浅拷贝.深拷贝 3.1.浅拷贝 3.1.1.不 ...

  5. python浅拷贝和深拷贝

    >>> import copy >>> a = [0,1,2,[3,4]] >>> b = a # 赋值 >>> c = a[: ...

  6. 二、Python浅拷贝和深拷贝

    1.深拷贝和浅拷贝 1.1.基本概念 ​ 浅拷贝(shallow copy ):拷贝父对象,不会拷贝对象的内部子对象 ​ A shallow copy creates a new object whi ...

  7. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  8. python中的引用、浅拷贝和深拷贝

    在python中,有一句话:"一切皆为对象,一切皆为对象的引用",所以 只要记住这句话就很容易清楚python中的引用.浅拷贝和深拷贝了. 1. 引用 python中的引用是经常使 ...

  9. Python赋值、浅拷贝、深拷贝

    一.赋值(assignment) >>> a = [1, 2, 3] >>> b = a >>> print(id(a), id(b), sep= ...

最新文章

  1. Spring-注入参数详解-[字面值及引用其他Bean]
  2. CSS知识点个人总结(不断更新)
  3. 计算机应用技术知识,计算机应用技术主要学什么
  4. html目录参数加密,从HTML文件中取出JS加密需要的参数,并调用js内的加密算法
  5. 【12c】12c RMAN新特性之通过网络远程恢复数据库(RESTORE/Recover from Service)
  6. ubuntu终端执行shell脚本报command not found解决方法
  7. Google退出中国,谁的压力最大?
  8. 形态学图像处理之边界提取与跟踪
  9. 基于simhash的文本去重原理
  10. python随机数生成代码_Python随机数生成器小白使用大全
  11. Python爬虫——Scrapy框架爬取腾讯招聘
  12. 强化学习经典算法笔记(六):深度Q值网络 Deep Q Network
  13. Android中的SQLite数据库
  14. 人工智能到底是什么?AI基础概念深度解析
  15. 不会产生ICMP差错报文的情况
  16. iOS 一步步带你实践组件二进制方案
  17. 2K薪酬收微博评论自动点赞码源 有能力的大佬加Q 9596702
  18. TLS握手协议分析与理解——某HTTPS请求流量包分析
  19. android安装nodejs6,使用安卓手机搭建node-red
  20. 基于等价类的邮箱注册测试用例设计

热门文章

  1. AcWing1085.不要62(数位DP)题解
  2. GNN在谱域下的演化:Spectral CNN,ChebyNet,GCN
  3. ORB-SLMA3的学习笔记
  4. 自动驾驶——图像识别的学习笔记
  5. MySQL 事务控制语句(TCL)
  6. 完美解决 IDEA plugins 插件搜索不出结果
  7. 【牛腩1】--- 服务器错误:编译错误
  8. tomcat6.0 JNDI 配置(图解)
  9. 前端三大框架 Vue.js、AngularJS、React 的区别
  10. 数据库复习 库 表 记录的 增删改查 基础