博客参考:点击这里

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. 201521123013 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 Q1.1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥 ...

  2. 笔记2 linux多线程 读写锁

    //read write lock #include<stdio.h> #include<unistd.h> #include<pthread.h> struct ...

  3. python列表补充、循环

    优先掌握部分 切片l=['a','b','c','d','e','f']print(l[1:5])print(l[1:5:2])print(l[2:5])print(l[-1])了解print(l[- ...

  4. Oracle-表的字段增加修改删除操作

    表结构修改 ALTER TABLE SCOTT.TEST RENAME TO TEST1--修改表名 ALTER TABLE SCOTT.TEST RENAME COLUMN NAME TO NAME ...

  5. PHP 动态调整内存限制

    最近公司的一个PHP项目在操作大文件的时候总是抛出这个异常 Fixing PHP Fatal Error: Allowed Memory Size Exhausted 经过一番调试后发现是达到了PHP ...

  6. 谈一谈synchronized关键词

    1.使用 java中的每一个对象都可以作为synchronized的锁进行代码同步,常见的形式 同步代码块锁是synchronized括号内的对象 普通成员方法上,锁是当前的对象,synchroniz ...

  7. bat文件逐行读取txt

    From_Ip='192.138.60.16'@echo offfor /f "tokens=1,2 delims='" %%a in (D:\ETL\bat\config.txt ...

  8. pig报错

    pig failed to read data from....... 错误可能1:load data的目录不在,或者引用出错,load data '/in/train'这里的红色/应该去掉,因为默认 ...

  9. ②jquery复习

    # jQuery 复习--by 传智前端与移动开发学院 ## 1. jQuery是什么?(了解)+ www.github.com+ jQuery 其实就是一堆的js函数,是普通的js,只不过应用广泛, ...

  10. GCD之全局、主线程

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -(NSString *)fetchData {     [NSThread sleepFo ...