python中的对象拷贝
python中。进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递。假设是列表或字典则是引用传递。那python怎样对列表和字典进行拷贝传递呢:标准库的copy模块提供了两个方法:copy和deepcopy方法。
1. copy.copy 浅拷贝 仅仅拷贝父对象,不会拷贝对象的内部的子对象。
2. copy.deepcopy 深拷贝 拷贝对象及其子对象
见下例:
import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象e = a[:] #利用分片操作进行拷贝(浅拷贝)
b = a #赋值。传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝a.append(5) #改动对象a
a[4].append('c') #改动对象a中的['a', 'b']列表子对象print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d
执行结果:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]
e = [1, 2, 3, 4, ['a', 'b', 'c']]
分析:
b是a的一个引用。两者指向的对象同样,打印结果必定同样。c仅仅拷贝了a的中的父对象。对于a中嵌套的子对象列表并没有拷贝,所以c中的1,2,3,4是拷贝得到的副本,属于自己的,但嵌套的子对象列表还是a原来的。d的话,因为是深拷贝,所以子对象父对象都是拷贝生产的新的副本。全然不所原来a的影响。至于e,分片操作的效果等价于浅拷贝,结果和c同样。
以下以列表为例,看看函数參数传递和返回值中,是怎样进行引用传递的:
#coding=utf-8
def ggg():l = [1, 2, 3] #局部变量print 'local var ', lreturn ldef fff(l):l.append(100)l[2].append('c')print "global var ", l #全局变量return la = ggg()
print a
a.append(10)
print a
ggg()print '\n\n'a = [1, 2, ['a', 'b'], 3]
b = fff(a)
print a
b.append(1000)
print b
print a
执行结果:
local var [1, 2, 3]
[1, 2, 3]
[1, 2, 3, 10]
local var [1, 2, 3]
global var [1, 2, ['a', 'b', 'c'], 3, 100]
[1, 2, ['a', 'b', 'c'], 3, 100]
[1, 2, ['a', 'b', 'c'], 3, 100, 1000]
[1, 2, ['a', 'b', 'c'], 3, 100, 1000]
分析:
a接受函数ggg返回的局部变量。但改动a后第二次调用函数ggg,ggg内的局部变量l并没有受到影响,课件ggg返回局部变量时是拷贝传递,就像C++中的一样:函数不可能返回局部变量的引用,由于局部变量保存在函数的栈空间中,函数调用结束后,栈被销毁。不能够对局部变量进行引用了。
将a传递给函数fff后。a被改变了。说明进行了引用传递;函数fff的返回值赋给b。对b的改动也会影响到a,说明返回值也是进行的引用传递(只是这里返回的可不是局部变量了)。
另外,字典还有自己的copy方法。但没有deepcopy方法。其copy方法和上面的copy模块中的copy方法一样,也是实现的浅拷贝。
另一点:对于一般变量,假设想达到引用传递的效果,怎么办呢?python标准库中并没有提供类似C++中专门的引用或指针的机制,要实现函数内部对传入变量的改动有两种途径:
1、通过函数返回值又一次赋值变量。
2、将变量封装在列表中在传给函数。
最后一点:把一个类的对象传递给函数的时候,类似引用传递,在函数内部改动类的变量。会真正改变其值。见下例:
class TestClass(object):val1 = 100 #类变量def __init__(self):self.val2 = 200 #成员变量def change(obj):obj.val2 = 5555obj.val1 = 6666if __name__ == '__main__': inst0 = TestClass()print '$$$ ',inst0.val1 #100print '$$$ ',inst0.val2 #200change(inst0)print '*** ',inst0.val1 #6666print '*** ',inst0.val2 #5555
转载于:https://www.cnblogs.com/bhlsheji/p/5352330.html
python中的对象拷贝相关推荐
- 【转】python中的对象拷贝
转自:https://www.cnblogs.com/bhlsheji/p/5352330.html python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引 ...
- Javascript中的对象拷贝(对象复制/克隆)
Javascript中的对象拷贝(对象复制/克隆) 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 1. 对象的引用 要说"拷贝"还要先说"引 ...
- python中的对象_Python中的变量、对象
由于没时间系统学习下Python 只能见一个问题探究一个问题了 一.初级 - 对象 关于Python中的数据类型,今天重新认识了下.[参考] 首先,Python中,对象才有类型, 变量是没有类型的,它 ...
- Python 中的对象赋值、浅拷贝和深拷贝
一.对象赋值 首先,创建了一个名为 will 的变量,这个变量指向一个 list 对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同) 然后,通过 will 变量对 wilber 变量进 ...
- python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...
本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. class Foo ...
- zg手册 之 python2.7.7源码分析(1)-- python中的对象
为什么80%的码农都做不了架构师?>>> 源代码主要目录结构 Demo: python 的示例程序 Doc: 文档 Grammar: 用BNF的语法定义了Python的全部语法 ...
- Python中字典对象实现原理
python中字典对象实现原理 注:字典类型是Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1) 字典是Python的一种可变 ...
- python中ndarray对象实例化_Python —— 实例化ndarray对象
ndarray(全称The N-dimensional array)是存储着相同类型和大小的元素的多维数组.数组的维度和每个数组中的元素是由shape来决定的.数组中的元素类型是由dtype决定的.与 ...
- python中shelf对象_Python对象持久化存储工具pickle
Python 中有个序列化过程称为pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. 序 ...
最新文章
- 多线程导出excel_【开源资讯】MyExcel 3.7.0 发布,屏蔽多线程处理细节
- java 取日期_java取的日期的操作
- STM32看门狗总结
- 节点+Executor+Core+Task+Partition+RDD+job+DAG+stage+action算子之间的数量关系+两种并行度的区别
- mysql面试吗hi提_面试必备的10道MySQL题
- 各种系统程序更新链接
- 全面整理(随时更新)
- IO负载高的来源定位 IO系列
- spring源码-第四个后置处理器
- 正点原子STM32串口例程解析
- 如何让研发薪酬更具有吸引力?华为、阿里、腾讯的方法值得借鉴
- 基于STM32的自由度云台运动姿态控制系统
- 来吧,我和你聊聊操作系统
- 路侧停车系统有利有弊
- win无线网卡怎么进入监听模式_win10系统卸载网卡驱动的操作方法
- 台式计算机网络共享,笔记本(通过网线)共享给台式机上网
- C++ Primer Plus习题及答案-第五章
- tcp伪报头_TCPUDP伪首部详解
- 机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照
- Android免费小说阅读器—程序员自己的阅读器,没广告,所有小说可搜索,专注阅读体验
热门文章
- 如何消费WCF Data Services定义的服务操作
- C#中的空值的判断(转)
- 电脑键盘功能介绍_远程操控软件介绍
- 服务器硬件电路设计书籍,家庭网关硬件接口电路设计大全——电路精选(3)...
- java基础入门课后习题_《Java基础入门》课后习题及答案
- vivo自带便签新版_vivo手机笔记在哪里及如何用vivo手机做笔记?
- html盒子阴影的语法,css3 盒阴影box-shadow
- 请写出sfr和sbit的语句格式_单片机c语言的sbit和sfr
- html class css,div id class
- MATLAB表白利器