Python浅拷贝与深拷贝
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浅拷贝与深拷贝相关推荐
- Python 浅拷贝和深拷贝 - Python零基础入门教程
目录 一.Python 浅拷贝和深拷贝前言 二.Python 普通的变量赋值 三.Python 浅拷贝和深拷贝 1.Python 浅拷贝 copy 2.Python 深拷贝 deepcopy 3.Py ...
- python函数方法里面用浅复制深复制_图解 Python 浅拷贝与深拷贝
Python 中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象.对于不可变对象,通常没什么差别,但是处理可变对象或可变对象的集合时,你可能需要创建这些对象的 "真实拷贝" ...
- python——浅拷贝和深拷贝
这一篇的内容主要是关于python中浅拷贝和深拷贝的原理.博主的其他内容可以在其他专栏中查看,更多内容还在更新中. 变量赋值的底层逻辑 变量赋值机制 num1 = [1,2,3] num2 = num ...
- Python浅拷贝、深拷贝与防止数据被篡改
目录 一.概念解读 1.1.Python对象 1.2.可变与不可变对象 1.3.引用 二.逐步深入:引用赋值 2.1.不可变对象的引用赋值 三.主旨详解:浅拷贝.深拷贝 3.1.浅拷贝 3.1.1.不 ...
- python浅拷贝和深拷贝
>>> import copy >>> a = [0,1,2,[3,4]] >>> b = a # 赋值 >>> c = a[: ...
- 二、Python浅拷贝和深拷贝
1.深拷贝和浅拷贝 1.1.基本概念 浅拷贝(shallow copy ):拷贝父对象,不会拷贝对象的内部子对象 A shallow copy creates a new object whi ...
- python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝
在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...
- python中的引用、浅拷贝和深拷贝
在python中,有一句话:"一切皆为对象,一切皆为对象的引用",所以 只要记住这句话就很容易清楚python中的引用.浅拷贝和深拷贝了. 1. 引用 python中的引用是经常使 ...
- Python赋值、浅拷贝、深拷贝
一.赋值(assignment) >>> a = [1, 2, 3] >>> b = a >>> print(id(a), id(b), sep= ...
最新文章
- Spring-注入参数详解-[字面值及引用其他Bean]
- CSS知识点个人总结(不断更新)
- 计算机应用技术知识,计算机应用技术主要学什么
- html目录参数加密,从HTML文件中取出JS加密需要的参数,并调用js内的加密算法
- 【12c】12c RMAN新特性之通过网络远程恢复数据库(RESTORE/Recover from Service)
- ubuntu终端执行shell脚本报command not found解决方法
- Google退出中国,谁的压力最大?
- 形态学图像处理之边界提取与跟踪
- 基于simhash的文本去重原理
- python随机数生成代码_Python随机数生成器小白使用大全
- Python爬虫——Scrapy框架爬取腾讯招聘
- 强化学习经典算法笔记(六):深度Q值网络 Deep Q Network
- Android中的SQLite数据库
- 人工智能到底是什么?AI基础概念深度解析
- 不会产生ICMP差错报文的情况
- iOS 一步步带你实践组件二进制方案
- 2K薪酬收微博评论自动点赞码源 有能力的大佬加Q 9596702
- TLS握手协议分析与理解——某HTTPS请求流量包分析
- android安装nodejs6,使用安卓手机搭建node-red
- 基于等价类的邮箱注册测试用例设计