浅谈python 复制(深拷贝,浅拷贝)
博客参考:点击这里
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 复制(深拷贝,浅拷贝)的更多相关文章
- 浅谈Python时间模块
浅谈Python时间模块 今天简单总结了一下Python处理时间和日期方面的模块,主要就是datetime.time.calendar三个模块的使用.希望这篇文章对于学习Python的朋友们有所帮助 ...
- 浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 浅谈python字符串存储形式
http://blog.csdn.net/zhonghuan1992 钟桓 2014年8月31日 浅谈python字符串存储形式 记录一下自己今的天发现疑问而且给出自己现有知识有的回答. 长话短说,用 ...
- 开发技术--浅谈Python函数
开发|浅谈Python函数 函数在实际使用中有很多不一样的小九九,我将从最基础的函数内容,延伸出函数的高级用法.此文非科普片~~ 前言 目前所有的文章思想格式都是:知识+情感. 知识:对于所有的知识点 ...
- 开发技术--浅谈python数据类型
开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...
- 开发技术--浅谈python基础知识
开发|浅谈python基础知识 最近复习一些基础内容,故将Python的基础进行了总结.注意:这篇文章只列出来我觉得重点,并且需要记忆的知识. 前言 目前所有的文章思想格式都是:知识+情感. 知识:对 ...
- 浅谈js中的浅拷贝和深拷贝
在js中如何把一个对象里的属性和方法复制给另一个对象呢? 下面举一个例子来说明: var person={name:'chen',age:18}; var son={sex:'男'}; functio ...
- 【javascript】浅谈javaScript的深拷贝
前言: 最开始意识到深拷贝的重要性是在我使用redux的时候(react + redux), redux的机制要求在reducer中必须返回一个新的对象,而不能对原来的对象做改动,事实上,当时 ...
- [转]浅谈Python web框架
说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见:http://wi ...
随机推荐
- 201521123083《Java程序设计》第12周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- 如何设置Cookie 的值为中文的内容
默认情况下,cookie的值是不允许中文内容的.可以借助于java.net.URLEncoder先对中文字符串进行编码,将编码后的结果设为cookie值.当程序要读取cookie值时,先读取,然后使用 ...
- ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
java编程时偶尔出现运行结果下面这样的错误: ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code ...
- 201521123063 《Java程序设计》 第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图.Onenote或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 1.1 建立数据库test.表students. ...
- 201521123031 《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- Spring注解@Qualifier
在使用Spring框架中@Autowired标签时默认情况下使用 @Autowired 注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个.当找不到一个匹配的 Bean ...
- NET_NET深入体验与实战 第一章 .NET你知道 1.1什么是 .NET
1.1什么是 .NET 1.微软定义:Microsft.NET 是微软以 Web Service为核心的,支持 信息,人,系统的一组软件产品,技术或者服务. 2.战略和梦想:(1) Microsft ...
- CSS3的颜色渐变效果
在 animate.css寻找自己想要的动态效果,看到标题Animate.css和按钮Animate it的颜色在逐渐变化,觉得蛮有趣的,把控制变化的相关代码扒了下来,自己分析实现一波. 一开始认为使 ...
- 三大修饰符static,final,abstract,接口和抽象类的区别
package com.cityhero.test; public class ThreeModifier { //static静态的 // 概念:static可以修饰方法和属性,被static修的方 ...
- foreach循环中为什么不要进行remove/add操作
先来看一段代码,摘自阿里巴巴的java开发手册 List<String> a = new ArrayList<String>(); a.add("1"); ...