博客参考:点击这里

python中对象的复制以及浅拷贝,深拷贝是存在差异的,这儿我们主要以可变变量来演示,不可变变量则不存在赋值/拷贝上的问题(下文会有解释),具体差异如下文所示

1.赋值:

 a=[1,2,3]
b=a
a.append('')
print 'b=',b

  实例输出结果如下:

 b= [1, 2, 3, '']

  这儿我们只对列表a进行了操作,但列表b也随之改变,根本原因是在进行赋值操作的时候,变量a与变量b指向了相同的内存地址,实例如下:

 #coding=utf-8
a=[1,2,3]
b=a
print "变量a的内存地址:",id(a) #获取变量的内存地址
print "变量b的内存地址:",id(b)
a.append(4)
print "变量a的内存地址:",id(a)
print "变量b的内存地址:",id(b)

输出结果如下:

 变量a的内存地址: 39012592
变量b的内存地址: 39012592
变量a的内存地址: 39012592
变量b的内存地址: 39012592

  以上结果可以看出进行赋值操作时变量与变量b的内存地址一致,故而在变量a值发生改变时,变量b的值也随之改变。

  但这种情况只针对可变变量,str属于不可变变量,值发生改变的时候会重新申请新的地址,实例如下:

 #coding=utf-8
a=''
print ' 变量a的内存地址:',id(a)
a=''
print ' 变量a的内存地址:',id(a)

  输出结果如下:

  变量a的内存地址: 38734832
变量a的内存地址: 38734856

2.浅拷贝(copy.copy())

 #coding=utf-8
import copy
a=[1,2,3]
b=copy.copy(a)
print ' 变量a的内存地址:',id(a)
print ' 变量b的内存地址:',id(b)
a.append(4)
print b

  输出结果:

  变量a的内存地址: 38160664
变量b的内存地址: 38203224
[1, 2, 3]

  因为变量a与变量b的内存地址不一样,故而在变量a发生改变时,变量b未改变,但因为浅拷贝依然会使用原始变量中元素的地址,实例如下:

 #coding=utf-8
import copy
a=[1,2,3]
b=copy.copy(a)
for i in range(0,len(a)):
print ' 变量a中第%d的内存地址:%d'%(i,id(a[i]))
for i in range(0,len(b)):
print ' 变量b中第%d的内存地址:%d'%(i,id(b[i]))

  输出结果:

  变量a中第0的内存地址:33860840
变量a中第1的内存地址:33860828
变量a中第2的内存地址:33860816
变量b中第0的内存地址:33860840
变量b中第1的内存地址:33860828
变量b中第2的内存地址:33860816

  由输出结果可知,变量a和变量b中的元素的内存地址是一致的,当变量a中存在可变元素时,对可变元素进行更改,变量b依然会同时进行更改,实例如下:

 #coding=utf-8
import copy
a=[1,2,3,[11,2,3]]
b=copy.copy(a)
print '变量a修改前,b的内容:',b
a[3].append(4)
print '变量a修改后,b的内容:',b

  输出如下:

 变量a修改前,b的内容: [1, 2, 3, [11, 2, 3]]
变量a修改后,b的内容: [1, 2, 3, [11, 2, 3, 4]]

3.深拷贝(copy.deepcopy())

 #coding=utf-8
import copy
a=[1,2,3,[11,2,3]]
b=copy.deepcopy(a)
for i in range(0,len(a)):
print ' 变量a中第%d的内存地址:%d'%(i,id(a[i]))
for i in range(0,len(b)):
print ' 变量b中第%d的内存地址:%d'%(i,id(b[i]))

  输出如下:

  变量a中第0的内存地址:30518504
变量a中第1的内存地址:30518492
变量a中第2的内存地址:30518480
变量a中第3的内存地址:38553880
变量b中第0的内存地址:30518504
变量b中第1的内存地址:30518492
变量b中第2的内存地址:30518480
变量b中第3的内存地址:38643072

  变量a与变量b中的每一个元素的内存地址都不相同,故而变量a发生改变时,变量b不会随之改变。

总结:

  1.赋值,浅拷贝,深拷贝只针对可变变量,如list,dict,tuple

  2.python中赋值都是进行内存地址的传递

  3.浅拷贝(copy,copy())只会赋值对象,重新申请内存地址,但对于对象中的元素依然是原始的内存地址引用

  4.如果要完全拷贝一个对象,请使用copy.deepcopy()

写在后面:

  每天写一点,总有一天我这条咸鱼能变得更咸

浅谈python 复制(深拷贝,浅拷贝)的更多相关文章

  1. 浅谈Python时间模块

    浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...

  2. 浅谈Python在信息学竞赛中的运用及Python的基本用法

    浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...

  3. 浅谈python字符串存储形式

    http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...

  4. 开发技术--浅谈Python函数

    开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...

  5. 开发技术--浅谈python数据类型

    开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...

  6. 开发技术--浅谈python基础知识

    开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...

  7. 浅谈js中的浅拷贝和深拷贝

    在js中如何把一个对象里的属性和方法复制给另一个对象呢? 下面举一个例子来说明: var person={name:'chen',age:18}; var son={sex:'男'}; functio ...

  8. 【javascript】浅谈javaScript的深拷贝

        前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...

  9. [转]浅谈Python web框架

    说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见:http://wi ...

随机推荐

  1. 【Beta阶段】第四次scrum meeting

    Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 查找适合的素材模块,和105一起把手势功能连接到APP上 100% 查阅换 ...

  2. 201521123082《Java程序设计》第4周学习总结

    201521123082<Java程序设计>第4周总结 标签(空格分隔): java 1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内 ...

  3. 201521123107 《Java程序设计》第1周学习总结

    第1周学习总结 1.本周学习总结 本周我们正式开始了对一门新的编程语言java的学习.本周的主要内容是初步了解了java的发展过程,java具有简约且简单 .平台无关性等优点.java的3个关键的工具 ...

  4. 201521123044 《Java程序设计》第01周学习总结

    1.本章学习总结 你对于本章知识的学习总结 1.了解了Java的发展史. 2.学习了什么是JVM,区分JRE与JDK,下载JDK. 3.从C语言的.c 到C++的 .cpp再到Java的.java,每 ...

  5. Java中 == 和 equals()详解

    java中的数据类型分为两种: 一 .基本数据类型: byte.short.int.long.float.double.char.boolean 比较它们需要用  ==  ,比较的是它们的值是否相等 ...

  6. Python2.7笔记——常用技术点汇总

    目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...

  7. 泛型在Web中的作用

    当我们写网页的时候,常常会有多个DAO,我们要写每次都要写好几个DAO,这样会有点麻烦. 那么我们想要的效果是什么呢??只写一个抽象DAO,别的DAO只要继承该抽象DAO,就有对应的方法了. 要实现这 ...

  8. Java简单实用方法一

    整理以前的笔记,在学习Java时候,经常会用到一些方法.虽然简单但是经常使用.因此做成笔记,方便以后查阅 这篇博文先说明构造和使用这些方法. 1,判断String类型数据是否为空 String类型的数 ...

  9. Java多线程Runnable与Callable区别与拓展

    我们先来分别看一下这两个接口 Runnable: // // Source code recreated from a .class file by IntelliJ IDEA // (powered ...

  10. php数组合并,反转,去重,添加元素等;

    //参数默认值//function abc($a,$b,$c = 0){// echo $a,$b,$c;//}//abc(1,3);//结果等于130://echo "<br> ...