深拷贝、浅拷贝

1. 浅拷贝

浅拷贝是对于一个对象的顶层拷贝

import copy

a = [[1, 2], 3]
b = copy.copy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1])) a[0].append(1)
print(a)
print(b)

输出结果:

2249583452872
2250135748552
2249583452808
2249583452808
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]

copy()是浅拷贝,只拷贝了最顶层的数组,而数组中的内容只是拷贝了引用。

因此用a[0].append(1)方法后,数组a和b都发生了改变。

2. 深拷贝

深拷贝是对于一个对象所有层次的拷贝(递归)

import copy

a = [[1, 2], 3]
b = copy.deepcopy(a)
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0])) a[0].append(1)
print(a)
print(b)

输出结果:

1931836547784
1932360400776
1931836547720
1931837818120
[[1, 2, 1], 3]
[[1, 2], 3]

deepcopy()是深拷贝,不仅拷贝最顶层的数组,数组里的内容也拷贝了,这里不同于拷贝引用,而是创建了新的地址空间,存放的内容和原数组相同。因此这次用a[0].append(1)后,b数组没有发生变化。

3.拷贝的其他方式

分片拷贝浅拷贝

import copy

a = [[1, 2], 3]
b = a[:]
print(id(a))
print(id(b))
print(id(a[0]))
print(id(b[0]))
print(id(a[1]))
print(id(b[1])) a[0].append(1)
print(a)
print(b)

输出结果:

2672287769288
2672811617864
2672287769224
2672287769224
140714232963984
140714232963984
[[1, 2, 1], 3]
[[1, 2, 1], 3]

  

可见:分片拷贝是浅拷贝。

字典的copy()方法

d = dict(name='xiaoming', friend=['xiaohong', 'xiaoying'])

c = d.copy()

print(d)
print(c) print(id(d))
print(id(c)) print(id(d['name']))
print(id(c['name'])) print(id(d['friend']))
print(id(c['friend'])) d['friend'].append('lisa') print(d)
print(c)

  

结果:

{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying']}
2175018372336
2175021103360
2175021498672
2175021498672
2175017902728
2175017902728
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}
{'name': 'xiaoming', 'friend': ['xiaohong', 'xiaoying', 'lisa']}

  

可见,字典的copy()方法也是浅拷贝。

4.注意

copy()和deepcopy()对于不包含可变类型数据的元组,只会拷贝引用

import copy

d = (1, 2, 3)

c = copy.copy(d)
b = copy.deepcopy(d) print(id(d))
print(id(c))
print(id(b))

结果:

1959295969464
1959295969464
1959295969464

当deepcopy()对于包含可变类型数据的元组时,才会拷贝整个元组的内容

import copy

d = (1, 2, [1,2,3])

c = copy.copy(d)
b = copy.deepcopy(d) print(id(d))
print(id(c))
print(id(b))

  

结果:

2774011472056
2774011472056
2774011384024

  

Python——深拷贝和浅拷贝的更多相关文章

  1. python 深拷贝与浅拷贝

    浅拷贝的方式有: lst=[1,2,3] (1)直接赋值: lst_cp = lst (2)for循环遍历生成:lst_cp= [i for i in lst] (3)copy模块下,copy.cop ...

  2. Python深拷贝和浅拷贝

    1- Python引用计数[1] 1.1 引用计数机制 引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象.内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的 ...

  3. 【python测试开发栈】—理解python深拷贝与浅拷贝的区别

    内存的浅拷贝和深拷贝是面试时经常被问到的问题,如果不能理解其本质原理,有可能会答非所问,给面试官留下不好的印象.另外,理解浅拷贝和深拷贝的原理,还可以帮助我们理解Python内存机制.这篇文章将会通过 ...

  4. Python深拷贝与浅拷贝区别

    可变类型 如list.dict等类型,改变容器内的值,容器地址不变. 不可变类型 如元组.字符串,原则上不可改变值.如果要改变对象的值,是将对象指向的地址改变了 浅拷贝 对于可变对象来说,开辟新的内存 ...

  5. Python 深拷贝和浅拷贝的区别

    python的复制,深拷贝和浅拷贝的区别    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用  ...

  6. python深拷贝和浅拷贝的区别

    首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...

  7. PYTHON 深拷贝,浅拷贝

    声明:本篇笔记,模仿与其它博客中的内容 浅拷贝 浅拷贝,在内存中只额外创建第一层数据 import copy n1 = {"k1": "wu", "k ...

  8. Python 深拷贝和浅拷贝

    Python中,对象的赋值,拷贝(深/浅拷贝)之间是有差异的,如果使用的时候不注意,就可能产生意外的结果. 下面本文就通过简单的例子介绍一下这些概念之间的差别. 对象赋值 直接看一段代码: will= ...

  9. Python深拷贝和浅拷贝!

    在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一般有三种方法, alist=[1,2,3,[& ...

随机推荐

  1. 112. Path Sum (Tree; DFS)

    Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...

  2. Windows 安装 Maven 及 Eclipse 安装Maven插件

    环境说明: window 8.1 64bit Eclipse Version: Luna Release (4.4.0) Maven 3.0.5 Windows Maven 安装: 1.确保安装了JD ...

  3. asp.net 母版页使用详解

    母版页是VS2005中新引入的一个概念,它很好地实现界面设计的模块化,并且实现实现了代码的重用.它就像婚纱影楼中的婚纱模板,同一个婚纱模板可以给不同的新人用,只要把他们的照片贴在已有的婚纱模板就可以形 ...

  4. 如何启动jdeveloper中集成的weblogic

    1>运行jdeveloper,打开运行日志,入下图,日志最开始的红框部分就是打开weblogic的命令,将此命令复制出来执行即可打开weblogic 程序员的基础教程:菜鸟程序员

  5. "分辨率"到底是个什么概念?它和DPI之间是什么关系?

    "分辨率"到底是个什么概念?它和DPI之间是什么关系? 分辨率:显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少.由于屏幕上的点.线和面都是由像素组成的, ...

  6. Ajax定时局部刷新

    1.局部刷新一个地方 function refreshOnTime(){ $.ajax({ //配置 }); //7秒后重复执行该函数 setInterval('refreshOnTime', 700 ...

  7. jstack调试core文件

    摘自:https://stackoverflow.com/questions/37331266/jstack-throws-exception-interrogating-a-core // 错误示例 ...

  8. 【转载】SQL注入攻防入门详解

    滴答…滴答…的雨,欢迎大家光临我的博客. 学习是快乐的,教育是枯燥的. 博客园  首页  博问  闪存    联系  订阅 管理 随笔-58 评论-2028 文章-5  trackbacks-0 站长 ...

  9. css3的那些高级选择器二

    在上个星期我介绍了css3的属性选择器,伪类选择器和结构伪类选择器,今天楼主继续把其它的css3选择器说完. 在css3中,共有11中UI状态伪类选择器,分别是E:hover,E:active,E:f ...

  10. 设计模式21:State 状态模式(行为型模式)

    State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. ...