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. 01_创建一个新的activity&activity配置清单文件

    今天开始学四大组件.今天是学Activity,然后是广播接收者,然后是服务,然后是内容提供者.四大组件,咱们一天一个.Activity就是跟用户交互的界面,大部分的应用都不会只有这么一个界面.创建多个 ...

  2. JS Promise API

    一.描述 我们知道JavaScript语言的执行环境是“单线程”,所谓单线程,就是一次只能够执行一个任务,如果有多个任务的话就要排队,前面一个任务完成后才可以继续下一个任务. 这种“单线程”的好处就是 ...

  3. JavaScript实现对象的深度克隆及typeof和instanceof【简洁】【分享】

    JavaScript实现对象的深度克隆 代码实现如下: <!DOCTYPE html> <html lang="en"> <head> < ...

  4. ObjectARX2012错误1 fatal error C1083: 无法打开包括文件:“arxHeaders.h”: No such file or directory; fatal error C1083: 无法打开包括文件:“map”: No such file or directory

    问题1:fatal error C1083: 无法打开包括文件:“arxHeaders.h”: No such file or directory: 解决办法:这个问题很明显,是因为没有在工程属性里包 ...

  5. Qt事件系统之四:定时器事件与随机数

    一.定时器事件和随机数 QTimerEvent类用来描述一个定时器事件.对于一个QObject的子类,只需要使用int QObject::startTimer ( int interval)函数来开启 ...

  6. HDU 1568 快速求斐波那契前四位

    思路: 把斐波那契通项公式转化成log的形式,高中数学... //By SiriusRen #include <bits/stdc++.h> using namespace std; ], ...

  7. 2017 JUST Programming Contest 3.0 H. Eyad and Math

    H. Eyad and Math time limit per test 2.0 s memory limit per test 256 MB input standard input output ...

  8. 32位Oracle10g在64位CentOS下安装失败记录

    环境信息:Alibaba Cloud Elastic Compute Service,CentOS Linux release 7.4.1708 (Core),16C/64GB. 使用32位Oracl ...

  9. 配置maven环境变量cmd控制台提示:mvn不是内部或外部命令,也不是可运行的程序或批处理文件

    配置maven环境变量cmd控制台提示:mvn不是内部或外部命令,也不是可运行的程序或批处理文件 首先maven环境变量: 变量名:MAVEN_HOME 变量值:E:\apache-maven-3.2 ...

  10. 转】upstart封装mongodb应用为系统服务

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! upstart封装mongodb应用为系统服务 ...