python 深复制和浅复制
https://www.python-course.eu/python3_deep_copy.php
-----------------------------------------------------------------------
summarry:
>>> colours1 = ["red", "blue"]
>>> colours2 = colours1
>>> print(colours1)
['red', 'blue']
>>> print(colours2)
['red', 'blue']
>>> print(id(colours1),id(colours2))
43444416 43444416
# colours2是colours1的浅复制,即只复制了引用指针,所以他们的内存地址是一样的,简单地说colours2只是colours1的别名 >>> colours1 = ["red", "blue"]
>>> colours2 = ["rouge", "vert"]
>>> print(colours1)
['red', 'blue']
>>> print(colours2)
['rouge', 'vert']
>>> print(id(colours1),id(colours2))
43444416 43444200
# 这里的colours2已经不是colours1的浅复制了,colours2获得了内存分配的地址,是一个与colours1无关的新变量。 >>> colours2[1] = "green"
>>> print(id(colours1),id(colours2))
14603760 14603760
>>> print(colours1)
['red', 'green']
>>> print(colours2)
['red', 'green']
# colours2改变了第二个元素值,即改变了colours1的第二个值,这是浅复制的结果 >>> colours1 = ["red", "blue"]
>>> colours2 = colours1[:]
>>> colours2[1] = "orange"
>>> colours1
["red", "blue"]
>>> colours2
["red", "orange"]
# 但如果我们使用切片复制的话就不会受到浅复制的影响,前提是复制的对象是不含子列表的。 >>> lst1 = ['a','b',['ab','ba']]
>>> lst2 = lst1[:]
>>> lst2[0] = 'c'
>>> print(lst1)
['a', 'b', ['ab', 'ba']]
>>> print(lst2)
['c', 'b', ['ab', 'ba']]
>>>
>>> lst2[2][1] = 'd'
>>> print(lst1)
['a', 'b', ['ab', 'd']]
>>> print(lst2)
['c', 'b', ['ab', 'd']]
# 如果复制的对象包含子列表的话也会受到浅复制的影响。因为lst1和lst2第3个元素指针是指向同一个list对象,即['ab', 'ba'] >>> from copy import deepcopy
>>>
>>> lst1 = ['a','b',['ab','ba']]
>>>
>>> lst2 = deepcopy(lst1)
>>>
>>> lst1
['a', 'b', ['ab', 'ba']]
>>> lst2
['a', 'b', ['ab', 'ba']]
>>> id(lst1)
139716507600200
>>> id(lst2)
139716507600904
>>>
>>> lst2[2][1] = "d"
>>> lst2[0] = "c"
>>> print(lst1)
['a', 'b', ['ab', 'ba']]
>>> print(lst2)
['c', 'b', ['ab', 'd']]
# 所以要深复制可以用from copy import deepcopy ---------------------------------------------------------------------------------------
以下本人的验证的一个例子,感觉说的不对或不顺的自己验证一下,我不保证都对。 #!/usr/bin/python
# -*- coding: UTF-8 -*- import copy
dict1 = {'user': 'vickey', 'num': [1, 2, 3],'age':{'a':'1','b':'2'}}
dict2 = dict1 # 对原始数据的任何操作都会影响该复制
# 先进行数据的浅复制和深复制操作
dict3 = dict1.copy() # 浅复制: 一级为引用对象,二级为拷贝;原始数据的二级目录改变了,浅复制的数据的二级目录也会改变,但一级目录不变
dict4 = copy.deepcopy(dict1) # 深复制:深拷贝父对象(一级目录),子对象(二级目录)是引用,非拷贝;简单地说就是与最原始的的数据时完全一致的
# 修改 data 数据
dict1['user'] = 'root'
dict1['num'].remove(3)
dict1['num'].append(6)
dict1['age']['a'] = '111'
# 对数据操作后再复制,则深复制和浅复制无差别了,都是更改后的数据
# dict3 = dict1.copy()
# dict4 = copy.deepcopy(dict1)
# 输出结果
print(dict1)
print(dict2)
print(dict3)
print(dict4) 打印结果
{'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'root'}
{'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'root'}
{'age': {'a': '111', 'b': '2'}, 'num': [1, 2, 6], 'user': 'vickey'}
{'age': {'a': '1', 'b': '2'}, 'num': [1, 2, 3], 'user': 'vickey'}
python 深复制和浅复制的更多相关文章
- Python学习日记之字典深复制与浅复制
Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...
- .Net深复制、浅复制
在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...
- C++学习基础七——深复制与浅复制
一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...
- php对象当参数传递 && php深复制和浅复制
把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象 因为对象是引用传递过去的 class Book { public $name; public function __construct( ...
- iOS 集合的深复制与浅复制
概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...
- Java中对象的深复制和浅复制详解
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...
- Java中的深复制与浅复制
1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...
- C#深复制和浅复制
本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...
- C#深复制与浅复制
C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...
随机推荐
- tcp/ip网络通讯安全加密方法
tcp/ip网络通讯安全是一个广受关注的话题,现在也有一些基于tcp/ip加密技术标准如SSL,TLS等.但很多时候编写一些简单的网络通讯把这标准加密应用添加进来乎一下子把程序变得复杂了,而实现自己的 ...
- uCos-III移植到STM32F10x
最近在百度上看了uCOS-III 的介绍后,诸多功能有很大的提升和改进,感觉有必要升级一下开发环境.百度介绍:http://baike.baidu.com/view/8531313.htm 环境: S ...
- 记重大失误(SQLserver数据回滚)ApexSQL
敲了一天代码,脑壳昏,更改数据时忘记加where条件,该数据库又未备份.修改了1800条数据..当时那个着急啊. 各种找解决方法,最后使用ApexSQL Log 完美解决.赞一个 ApexSQL L ...
- js调用的注意项
注意将js代码写在调用的前面 这样他就知道了 自己所调用的函数是什么了
- C#基础第一天 VS2013基本设置
1 .net能干什么 桌面应用程序 winform internet应用程序 Asp.net->京东.msdn.招聘银行 手机开发 wp8 unity3D游戏开发或者虚拟现实 2 .net两种交 ...
- HDU 5514 Frogs (数论容斥)
题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 析:首先可以知道的是第 i 只青蛙可以跳到 k * gcd(ai, m),然后我就计 ...
- 4 Java 如何判定是否存活或者死亡
在堆中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事就是要确定这些对象之中哪些还活着,哪些对象已经死去. 判断对象是否已经死亡有以下几种算法: 引用计数法算法 定义 : 给对象中添加一 ...
- bzoj 1858: [Scoi2010]序列操作【线段树】
合并中间那块的时候没取max--WAWAWA 在线段树上维护一堆东西,分别是len区间长度,sm区间内1的个数,ll0区间从左开始最长连续0,ml0区间中间最长连续0,rl0区间从右开始最长连续0,l ...
- bzoj 1613: [Usaco2008 Jan]Running贝茜的晨练计划【dp】
设f[i][j]为第i分钟疲劳j,从三种情况转移,记得休息的时候判断从i开始休息到n能不能恢复到疲劳0 #include<iostream> #include<cstdio> ...
- bzoj 4818: [Sdoi2017]序列计数【容斥原理+dp+矩阵乘法】
被空间卡的好惨啊---- 参考:http://blog.csdn.net/coldef/article/details/70305596 容斥,\( ans=ans_{没有限制}-ans{没有质数} ...