在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝。

而对象又分为两种,一种是不可变对象(字符串、元组、数字 ),一种是可变对象(列表、字典)。

而深浅拷贝有三种情况:拷贝的是不可变对象、拷贝的是可变对象、拷贝的可变对象里面还有子对象

拷贝不可变对象

import copy
list0 = 'hello,world'
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0 print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

对list0()进行修改:list0 = list0 + 'good evening'

发现即使修改了list0,其他的值也不会变,地址也没有改变。

结论:对于不可变对象来说,深浅拷贝都一样的,即便是用深拷贝,也都是一样的id,如果要重新赋值,也只是创建一个新的对象,替换旧的对象。所以对于不可变对象来说,不管怎么拷贝,它的地址、值都是一样的。

拷贝可变对象

import copy
list0 = [1,2,3,4,5,6]
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0 print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

对于可变对象来说:

  赋值(我们暂且称它为’=浅拷贝’)的新对象与原对象相比,值相等,地址也相等;
  浅拷贝:与原对象相比,值相等,地址不相等;
  深拷贝:与原对象相比,值相等,地址不相等。

拷贝可变对象中还存在子对象的

import copy
list0 = [1,2,3,4,5,6, ['a', 'b']]
list1 = copy.copy(list0)
list2 = copy.deepcopy(list0)
list3 = list0
list0[6].append('c')
print(list0, id(list0))
print(list1, id(list1))
print(list2, id(list2))
print(list3, id(list3))

结论:浅拷贝没有拷贝子对象,所以原对象发生改变,其子对象也发生了改变,而深拷贝拷贝了子对象,原对象发生改变,其本身也不会改变。

深浅Copy的理解的更多相关文章

  1. day 14:深浅copy,数据结构 ,函数,set集合,变量作用域、返回值

    本节内容: 1,深浅copy 2,数据结构 3,函数 4,变量作用域 5,返回值,return 一.深浅copy 首先理解当给变量赋值的时候,是给变量存在值所在的内存地址 a = 10000 b = ...

  2. 我对js数据类型的理解和深浅(copy)的应用场景

    本人毕业一所专科院校,所学专业是计算机应用技术,在大学时对前端有了一定的了解之后,觉得自己对前端的兴趣十分强烈,开始自学前端,一路上也是坎坎坷坷,也有想要放弃的时候,还好坚持了下来,并且从事前端开发已 ...

  3. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  4. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

  5. Objective-C基础之简析深浅copy

    一.从面向对象到Objective-C概览copy 1.面向对象: In object-oriented programming, object copying is creating a copy ...

  6. python 的内存回收,及深浅Copy详解

    一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...

  7. python 浅析格式化输出和深浅copy

    一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

  8. python深浅copy探究

    引入 在python程序中,如果我们操作一个变量的值去做运算,而又想在下次调用时,仍使用原来的变量的值去做运算,那么我们我们就需要将这个变量去做备份,这就是本文所要探究的问题. 开始 变量-对象-引用 ...

  9. pathon 基础学习-集合(set),单双队列,深浅copy,内置函数

    一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在pyt ...

随机推荐

  1. spring boot + mybatis 访问 neo4j

    之前有通过rest的风格去访问,但是每次需要访问时候将statement一并加入header中去数据库执行,方式简单.且思路清晰,但是不便于形成模板调用,固采用mybaits来集成. 1.关键pom. ...

  2. jquery全屏图片滑动切换

    在线演示 本地下载

  3. C# 获取上传文件的文件名和后缀名

    //获得要上传的文件 HttpPostedFile file = Request.Files[]; //获得到文件名 string fileName = System.IO.Path.GetFileN ...

  4. phpcms分类信息地区识别跳转

    <script src="http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js"></scri ...

  5. LeetCode86 Partition List

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  6. UIWebView 真机iOS 8.x系统上报错

    crush发生后最终定位到: dyld`dyld_fatal_error: -> >: brk #0x3 控制台打印信息如下: dyld: Symbol not found: _OBJC_ ...

  7. QT开发ROS遇到问题:execute_process(/usr/bin/python"/home/fu/catkin_ws/build/catkin_genetated/generate_cached_setup.py)..........

    具体如上图显示,网上给的方法是重装ros和重新创建ROS工作空间.经过这样做以后发现问题依然存在. 最后考虑可能是没有加载ROS的环境变量.(我的qtcreator中已经有了创建ros工程的项目,但是 ...

  8. Python 基础06 循环

    循环用于重复执行一些程序块.从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系. 循环也会用到类似的写法. for 循环 for 循环需要预先设定好循环的次数(n) 然后执行隶属于fo ...

  9. H3C 命令行编辑功能

  10. 新浪微博API错误代码说明对照表 http://open.weibo.com/wiki/Error_code

    http://open.weibo.com/wiki/Error_code 这篇文章资料是从新浪微博开发平台分享过来,一方面是博主自己开发过程遇到问题对错误代码的快捷查询,不用每次都得到官方找:另一方 ...