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 深复制和浅复制的更多相关文章

  1. Python学习日记之字典深复制与浅复制

    Python中通过copy模块有两种复制(深复制与浅复制) copy 浅复制 复制时只会复制父对象,而不会复制对象的内部的子对象. deepcopy 深复制 复制对象及其子对象 因此,复制后对原dic ...

  2. .Net深复制、浅复制

    在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...

  3. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...

  4. php对象当参数传递 && php深复制和浅复制

    把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象  因为对象是引用传递过去的 class Book { public $name; public function __construct( ...

  5. iOS 集合的深复制与浅复制

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...

  6. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  7. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  8. C#深复制和浅复制

    本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...

  9. C#深复制与浅复制

    C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...

随机推荐

  1. 杂项-Java-百科:jar

    ylbtech-杂项-Java-百科:jar 在软件领域,JAR文件(Java归档,英语:Java ARchive)是一种软件包文件格式,通常用于聚合大量的Java类文件.相关的元数据和资源(文本.图 ...

  2. Integer和int的区别(转)

    public class TestInteger { public static void main(String[] args) { int i = 128; Integer i2 = 128; I ...

  3. 搭建CARDBOARD+ANDROID+unity3d的VR开发环境

    一.下载最新unity3d(u3d官网) 二.下载最新cardboardsdkforunity(https://github.com/googlesamples/cardboard-unity) 三. ...

  4. 使用vmware12安装Ubuntu 遇到的两个问题和解决

    1.need the x86-64 cpu,but only detected the xxx cpu. 这是因为bios中的virtual function 是 disabled,改为enabled ...

  5. _bzoj1003 [ZJOI2006]物流运输【预处理】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1003 预处理出第i天到第j天走一条航线时的最短路. #include <cstdio& ...

  6. 图论/位运算 Codeforces Round #285 (Div. 2) C. Misha and Forest

    题目传送门 /* 题意:给出无向无环图,每一个点的度数和相邻点的异或和(a^b^c^....) 图论/位运算:其实这题很简单.类似拓扑排序,先把度数为1的先入对,每一次少一个度数 关键在于更新异或和, ...

  7. Xcode7 使用AFNetWorking 报错 添加Security.framework

    Undefined symbols for architecture x86_64: "_SecCertificateCopyData", referenced from: _AF ...

  8. 纯css实现的三级水平导航菜单

    vscode练习使用开发纯css的三级水平导航菜单.先上图: 1.html5布局 <html> <head> <meta charset="UTF-8" ...

  9. 怪物猎人OL简单测评与碎碎念

    请移步我的个人网站查看: www.wuduojia.cn

  10. Pycharm+Django+Python+MySQL开发 后台管理数据库

    Django框架十分简单易用,适合搭建个人博客网站.网上有很多教程,大多是关于命令行操作Django,这里分享一些用最新工具进行Django开发过程,主要是PyCharm太强大,不用有点可惜. 第一次 ...