Python学习笔记之浅拷贝和深拷贝

原创 2017年07月15日 07:32:15

在python中对象的复制有三种一般的复制,浅拷贝,深拷贝,那么他们有什么区别呢

一般的复制

#encoding:utf-8
#定义一个嵌套集合
lista=[1,2,3,[4,5,6,[7,8,9]]]

listb=lista
#分别打印出 lista和listb的地址值
print id(lista) #4511103096
print id(listb) #4511103096

#修改lista中的内容,listb中的内容也会跟着修改

lista[0]=0
print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]
print listb #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]

通过以上实践会发现,复制操作就是将lista在内存中指向的地址,也让listb指向他,本身并没有在内存中创建地址。

浅拷贝

#encoding:utf-8
#定义一个嵌套集合
import copy
lista=[1,2,3,[4,5,6,[7,8,9]]]
#使用copy模块中copy方法
listb=copy.copy(lista)

print id(lista) #4396231640

print id(listb) #4396231712

#发现lista和listb在内存中的地址有区别,
#打印元素中的第一个元素的地址值
print id(lista[0])#140666751466536

print id(listb[0])#140666751466536

#元素的地址值是一样的,是不是意思就是,改变lista中的第一个元素,
# listb中的也要改变呢

lista[0]=0

print lista #[0, 2, 3, [4, 5, 6, [7, 8, 9]]]

print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

#结果发现,竟然没有跟着lista一起改变,为什么呢,因为使用了浅拷贝呗
#我们在打印下lista[0]和listb[0]的地址
print id(lista[0])  #140666751466560

print id(listb[0])  #140666751466536

#会发现lista[0]重新指向内存中的其他地址


#这时候可以通过以上的方法,修改lista[3],lista[3]也是一个list

print id(lista[3])#4499779240

print id(listb[3])#4499779240

#修改lista[3]中第一个元素呢

lista[3][0]=0

print lista #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]

print listb #[0, 2, 3, [0, 5, 6, [7, 8, 9]]]

#发现修改lista[3][0]元素的值,listb[3][0]也会跟着改变

根据以上实践说明,浅拷贝对对象中对象没有拷贝。

深拷贝

    #encoding:utf-8
    #定义一个嵌套集合
    import copy
    lista=[1,2,3,[4,5,6,[7,8,9]]]

    #深拷贝功能是在浅拷贝上做的加强,所以具备浅拷贝的功能
    listb=copy.deepcopy(lista)

    lista[3][0]=0

    print lista #[1, 2, 3, [0, 5, 6, [7, 8, 9]]]

    print listb #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

    #深拷贝会解决修改lista[3][0]值不会影响listb中的值

    #再来修改下第三层列表中元素是不是也完成拷贝

    lista[3][3][0]=0

    print lista  #[1, 2, 3, [0, 5, 6, [0, 8, 9]]]

    print listb  #[1, 2, 3, [4, 5, 6, [7, 8, 9]]]

    #没有受到任何影响
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Python学习笔记——深拷贝与浅拷贝

浅拷贝解读:开辟空间存放[11,22,33],然后将其地址放在a中,执行b = a后,将[11,22,33]的地址也放在b中。这样就完成了浅拷贝。 浅拷贝,拷贝后两者is和==都为true并且无论是a...

python学习笔记——浅拷贝与深拷贝

python的学习笔记

python学习笔记(五)深拷贝浅拷贝,文件和目录

python学习笔记(五) 深拷贝-浅拷贝

.NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)

 今天继续利用准备WSE安全开发文章的空闲时间,完善《.NET深入学习笔记》系列(基本都是.Net重要的知识点,我都做了详细的总结,是什么、为什么、和怎么实现)。想必很多人也接触过这两个概念。做过C+...
  • peng790
  • peng790
  • 2011年06月13日 15:48
  • 691

iOS学习笔记07--深拷贝与浅拷贝

指针拷贝、对象拷贝、深拷贝、浅拷贝

c++学习笔记(三):深拷贝与浅拷贝及等号运算符重载

#include #include //浅拷贝例子 没有自己写复制构造函数而是采用默认的复制构造函数 class name { public : name(char *pn) ; ...

VS2010 C++ 学习笔记(五) 析构函数 深拷贝浅拷贝 小练习

1.析构函数 ~类名() ~Student() ********************************************************************...

NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)

全文还是分四部分:1.基本概念  2.深拷贝与浅拷贝实现机制 3.代码实现和分析 4.总结。下面我们来进入正式的学习。    1.基本概念:        首先我们应该了解一下什么叫深拷贝...

java 设计模式学习笔记(7) - 浅拷贝和深拷贝

在JAVA 语言中,拷贝按拷贝结果分为两种:浅拷贝,深拷贝浅拷贝 :“被克隆对象的所有变量都含有与原来的对象相同的值,而它所有的对其他对象的引用都仍然指向原来的对象。换一种说法就是浅克隆仅仅克隆所考虑...
  • veverrr
  • veverrr
  • 2011年04月16日 21:28
  • 554

python中的深拷贝和浅拷贝(读书笔记)

python中,对象赋值实际上是简单的对象引用,也就是说当你创建一个对象,然后把它赋值给另一个变量的时候,python并没有拷贝这个对象,而是拷贝了这个对象的引用。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python学习笔记之浅拷贝和深拷贝
举报原因:
原因补充:

(最多只允许输入30个字)