1.什么是深浅拷贝?

python中一切皆对象,python中的数字、字符串、元组等,如果存放在了内存中,这部分内存里面的内容是不会改变的,但是也有情况,内存中存放了可变对象,比如说列表和字典,他们的内存空间是可以被修改的。

下面我们定义一个列表:

list=[1,2,3,4,5]

list1=list

list[0]=6

>>>list

[6,2,3,4,5]

>>>list1

[6,2,3,4,5]

如果我们只想改变list,问题就出现了。

赋值操作 list1 = list,是浅拷贝,当list的值改变的时候,list1的值跟着改变。

2.用for和[:]实现浅拷贝

list = [1,2,3,4,5]

list2= [ i for i in list]  //list2=list[:]

list2[-1]=0

>>> list

>>> list2

[1, 2, 3, 4, 5]

[1, 2, 3, 4, 0]

上面的例子,用for循环生成新的list2对象或者[:]切片赋值得到的list2,当改变list2的值时,list的值没有跟着改变,这就是深拷贝吗?且继续往下看:

3.

list = [1, 2, 3, [1,2009] ]

list3 = [ i for i in list]  //list2=list[:]

list3[-1].append(2009)

>>> list

>>> list3

[1, 2, 3, [1, 2009, 2009]]

[1, 2, 3, [1, 2009, 2009]]

3 和  2难道有矛盾?不。

解释:for循环操作的时候,把list中的每一个对象的引用拷贝,而list中的前3个元素是字符串对象,在python中,字符串对象赋值操作是:变量指向存放字符串的地址,所以看起来好像是深拷贝,实际上还是浅拷贝,若不信,请继续往下看:

4

for i in list:

print id(i)

3630168

3630156

3630144

46784880

for i in list3:

print id(i)

3630168

3630156

3630144

46784880

那么,在pyhton,深拷贝在哪呢?不急,下面就是了

5.

import copy

list= [1, 2, 3, [1,2009] ]

list5 = copy.deepcopy(list)

>>> list

[1, 2, 3, [1, 2009]]

>>> list5

[1, 2, 3, [1, 2009]]

list5[-1].append(2009)

>>> list5

[1, 2, 3, [1, 2009, 2009]]

>>> list

[1, 2, 3, [1, 2009]]

6.总结:

浅拷贝不会拷贝数据中的子对象。

例如:for ,切片浅拷贝,impord copy   copy.copy

深拷贝会拷贝数据中的子对象

例如:impord   copy.deepcopy

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

  1. 天啦噜!仅仅5张图,彻底搞懂Python中的深浅拷贝

    Python中的深浅拷贝 在讲深浅拷贝之前,我们先重温一下 is 和==的区别. 在判断对象是否相等比较的时候我们可以用is 和 == is:比较两个对象的引用是否相同,即 它们的id 是否一样 == ...

  2. Python 中的深浅拷贝

    Python 中的深浅拷贝 参考文献:https://blog.csdn.net/lnotime/article/details/81194633 参考文献:https://blog.csdn.net ...

  3. Python基础【3】:Python中的深浅拷贝解析

    深浅拷贝 在研究Python的深浅拷贝区别前需要先弄清楚以下的一些基础概念: 变量--引用--对象(可变对象,不可变对象) 切片(序列化对象)--拷贝(深拷贝,浅拷贝) 我是铺垫~ 一.[变量--引用 ...

  4. 挖一挖python中的深浅拷贝问题

    前几天在做面试题的时候,遇到一个与Python深浅拷贝的问题,今天总结出来一个方法,能够快速判断在对一个对象复制后,新对象与原来对象是否会互相影响的方法. 先抛出结论,然后我们对结论进行验证~~~ 先 ...

  5. Python中的深浅拷贝,赋值及引用

    简单来说,若对象a中存的是列表或字典等可变对象,b对a的浅拷贝只是对对象第一层的复制,修改b第二层的元素仍然会影响两个对象. 深拷贝则是不会影响原来的对象. import copy.copy() 浅拷 ...

  6. 【Python】Python中的深浅拷贝

    [转]python 复制(拷贝)对象 -- ::| 分类: Python |举报|字号 订阅 下载LOFTER我的照片书 | 需求: 你想复制一个对象.因为在Python中,无论你把对象做为参数传递, ...

  7. 浅谈Python中的深浅拷贝的区别

    深.浅拷贝总结 深拷贝 拷贝可变数据类型,如列表容器: a = [1, 2, [3, 4]] b = copy.deepcopy(a) a 与 b 所指的列表容器的空间地址不一致,即 id(a) != ...

  8. 关于Python中的深浅拷贝

    之前一直认为浅拷贝是拷贝内容的第一层,但是不开辟内存,只是增加新的指向原来的内容:深拷贝是拷贝是拷贝每一层并开辟内存. 其实这个是不严谨的不正确的. 从以上可以看出,浅拷贝中当时可变类型的时候,内存是 ...

  9. js中的深浅拷贝

    js中的深浅拷贝 js中有深拷贝.浅拷贝一说,所谓的深浅拷贝是针对value类型为引用类型(函数.对象.数组)而言的,大概理解的就是: 浅拷贝: 拷贝出的对象c和原始对象o,c和o在key对应的val ...

随机推荐

  1. 【转】如何配置android的adb环境变量

    转载地址:http://jingyan.baidu.com/article/17bd8e52f514d985ab2bb800.html 对于android的开发人员来说,首先要做的就是环境变量的配置. ...

  2. 关于js写全选的方法

    思路:用一个变量来存储值,点击复选框来改变值: 代码 var num = 0; obj.onclick = function(){ if(this.checked == true){ for(var ...

  3. zigbee学习之路(十一):看门狗

    一.前言 今天,我们要通过实验学习和认识一下看门狗的使用,看门狗是为了防止防止程序跑飞的,通过不断的喂狗,使看门狗能持续监管程序的运行状态,当程序跑飞时,能及时把程序拽回来. 二.原理与分析 在CPU ...

  4. python学习之迭代器与生成器

    1.迭代器省内存 迭代器只允许往后读数据,不允许回读数据 迭代器不能跳着读文件,因为他是一点一点加载文件内容到内存的,读完了可以销毁或丢掉 2.生成一个迭代器 a = iter(["fd&q ...

  5. Hibernate之环境搭建及demo

    ORM概念 ORM即Object/Relation Mapping, 对象/关系数据库映射.ORM是一种规范,完成面向对象编程语言到关系数据库之间的映射.J2EE中的JPA就是一种ORM规范. ORM ...

  6. poj2485 kruskal与prim

    Kruskal: #include<iostream> #include<cstdio> #include<algorithm> using namespace s ...

  7. c# winform DataGridView单击选中一整行,只能单选,不能选择多行,只能选择一行

    设置DataGridView的属性SelectionMode为FullRowSelect 这样就使DataGridView不是选择一个字段,而是选择一整行了 设置DataGridView的属性Mult ...

  8. 做Adsense的一些经验

    The payment you receive per click depends on how much advertisers are paying per click to advertise ...

  9. [Linux]cmd to use

    0x01 Linux Perfermance Analysis in 60s 1> uptime ---load averages 2> dmesg -r | tail ---kernel ...

  10. MySQL中的两种临时表

    MySQL中的两种临时表 伯乐在线2016-07-06 05:16:52阅读(4556)评论(3) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 ...