浅拷贝和深拷贝

简述

深浅拷贝的差异仅对复合对象有意义,比如列表,类实例。

浅拷贝

拷贝的副本共享内部对象的引用的拷贝为浅拷贝

举个栗子

list1 = [1, 2, [3, 4], (5, 6)]
list2= list(list1)
print("list1: ", list1, " list2: ", list2)
#list1: [1, 2, [3, 4], (5, 6)] list2: [1, 2, [3, 4], (5, 6)]
print("list1 id: ", id(list1), " list2 id: ", id(list2))
#list1 id: 4940488 list2 id: 38569032 print("\nlist1 element id:")
for ele1 in list1:
print(id(ele1))
#list1 element id:
#
#
#
# print("\nlist2 element id:")
for ele2 in list2:
print(id(ele2)) #list2 element id:
#
#
#
#

通过类构造函数对list1进行了浅拷贝,通过id(list1)和id(list2)可知list1与list2是两个不同的对象,

但是list1和list2共享内部对象的引用(由list1与list2中的各个元素的id(ele)可知)

上述代码的执行如下图:

浅拷贝方式

(1)通过类构造函数

(2)copy模块中的copy方法

(3)[:](仅对于可变序列)

深拷贝

拷贝的副本不共享内部对象的引用的拷贝为深拷贝

举个栗子

import copy
list1 = [1, 2, [3, 4], (5, 6)]
list2= copy.deepcopy(list1)
print("list1: ", list1, " list2: ", list2)
#list1: [1, 2, [3, 4], (5, 6)] list2: [1, 2, [3, 4], (5, 6)]
print("list1 id: ", id(list1), " list2 id: ", id(list2))
#list1 id: 35095880 list2 id: 35192776 print("\nlist1 element id:")
for ele1 in list1:
print(id(ele1)) #list1 element id:
#
#
#
# print("\nlist2 element id:")
for ele2 in list2:
print(id(ele2)) #list2 element id:
#
#
#
#

通过copy模块中的deepcopy对list1进行了深拷贝得到list2,由list1与list2的id可知list1与list2是两个不同的对象

由list1和list2中各个元素的id可知,lis1与list2t中的可变对象不共享对象引用

上述代码的执行如下图:

参考资料:<<流畅的python>>

python-浅拷贝和深拷贝的更多相关文章

  1. python 浅拷贝和深拷贝(9)

    何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~     一.普通的变量赋值 我们平常使用的变量赋值就是 ...

  2. python浅拷贝和深拷贝

    博文参考地址:https://blog.csdn.net/qq_20084101/article/details/82925067 最近在撸码的时候发现了一个严重的问题: a = [1,2] c = ...

  3. python浅拷贝与深拷贝

    今天写程序,人为制造了一个由浅拷贝引起的bug,有必要归纳一下.先附上源代码: class PerformanceTest(object): def __init__(self): ....... s ...

  4. Python浅拷贝与深拷贝(可变对象与不可变对象)

    第一次遇到深拷贝和浅拷贝的问题是用python在一个for循环中对一个list赋值,使用的语句是 a = b 这个b会不断带入循环,每次计算得到,最后发现list乱七八糟的,后来才发现,python中 ...

  5. python浅拷贝与深拷贝浅析

    首先我们要明确,python中大多数都是浅拷贝,我们先说原因: 1.时间花费更少 2.内存更小 3.效率更高,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高. 容器(如列表)切片是浅拷贝

  6. 学习Python一年,这次终于弄懂了浅拷贝和深拷贝

    官方文档:copy主题 源代码: Lib/copy.py 话说,网上已经有很多关于Python浅拷贝和深拷贝的文章了,不过好多文章看起来还是决定似懂非懂,所以决定用自己的理解来写出这样一篇文章. 当别 ...

  7. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  8. 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

    当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...

  9. python中的深拷贝与浅拷贝

    深拷贝和浅拷贝 浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变. 1.对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷 ...

  10. python的浅拷贝和深拷贝

    python对象有两种拷贝的形式:浅拷贝和深拷贝. 在<python核心编程>中看到对这两种拷贝的分析,觉得十分收益,所以记录在此. id()方法:id()方法可以查看某个对象的ID,类似 ...

随机推荐

  1. sublime Text3基本配置记录+python

    环境:ubuntu 内容:基本配置+python开发实用插件 一. 激活 注册码 Michael Barnes Single User License EA7E- 8A353C41 872A0D5C ...

  2. Unix时间转LInux时间

    private static long getTime() { long currentTimeMillis = System.currentTimeMillis(); long nanoTime = ...

  3. 关于Unity中物体分别在本地和世界坐标系对应方向的移动

    方向 Vector3可以定义以世界坐标轴为参考的三维矢量,Vector3.forward,Vector3.up,Vector3.right方别对应物体世界坐标系的Z,Y,X轴方向的单位向量,或者叫三维 ...

  4. Java中Comparable和Comparator区别

    很好的一篇博客:http://blog.csdn.net/jq_ak47/article/details/61203817 http://www.cnblogs.com/cmxwt/p/6215253 ...

  5. Linux 相关术语_002

    Linux(Linux is not unix)是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统. 它能运行主要的UNIX工 ...

  6. javassist实例

    我们常用到的动态特性主要是反射,在运行时查找对象属性.方法,修改作用域,通过方法名称调用方法等.在线的应用不会频繁使用反射,因为反射的性能开销较大.其实还有一种和反射一样强大的特性,但是开销却很低,它 ...

  7. laravel5.8笔记七:语言包

    语言包控制config/app.php 'locale' => 'en', 语言包位置:resources/lang/cn/ 建立resources/lang/cn/common.php < ...

  8. oneNote2016代码高亮插件

    下载地址:https://github.com/elvirbrk/NoteHighlight2016/releases 安装插件前必须安装oneNote笔记. NoteHighlight插件有32位和 ...

  9. windows下设置PHP环境变量

    1.找到“高级系统设置”(二选一的方法找到环境变量) ① 我的电脑-属性-高级-环境变量 ②win8,10 直接在搜索框搜 “查看高级系统设置”-环境变量 2.找到变量"Path" ...

  10. J.U.C