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中的对象拷贝相关推荐

  1. 【转】python中的对象拷贝

    转自:https://www.cnblogs.com/bhlsheji/p/5352330.html python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引 ...

  2. Javascript中的对象拷贝(对象复制/克隆)

    Javascript中的对象拷贝(对象复制/克隆) 李俊才 CSDN:jcLee95 邮箱:291148484@163.com 1. 对象的引用 要说"拷贝"还要先说"引 ...

  3. python中的对象_Python中的变量、对象

    由于没时间系统学习下Python 只能见一个问题探究一个问题了 一.初级 - 对象 关于Python中的数据类型,今天重新认识了下.[参考] 首先,Python中,对象才有类型, 变量是没有类型的,它 ...

  4. Python 中的对象赋值、浅拷贝和深拷贝

    一.对象赋值 首先,创建了一个名为 will 的变量,这个变量指向一个 list 对象,从第一张图中可以看到所有对象的地址(每次运行,结果可能不同) 然后,通过 will 变量对 wilber 变量进 ...

  5. python中类方法与实例方法的区别-Python中的对象,方法,类,实例,函数用法分析...

    本文实例分析了Python中的对象,方法,类,实例,函数用法.分享给大家供大家参考.具体分析如下: Python是一个完全面向对象的语言.不仅实例是对象,类,函数,方法也都是对象. class Foo ...

  6. zg手册 之 python2.7.7源码分析(1)-- python中的对象

    为什么80%的码农都做不了架构师?>>>    源代码主要目录结构 Demo: python 的示例程序 Doc: 文档 Grammar: 用BNF的语法定义了Python的全部语法 ...

  7. Python中字典对象实现原理

    python中字典对象实现原理 注:字典类型是Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1) 字典是Python的一种可变 ...

  8. python中ndarray对象实例化_Python —— 实例化ndarray对象

    ndarray(全称The N-dimensional array)是存储着相同类型和大小的元素的多维数组.数组的维度和每个数组中的元素是由shape来决定的.数组中的元素类型是由dtype决定的.与 ...

  9. python中shelf对象_Python对象持久化存储工具pickle

    Python 中有个序列化过程称为pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化.也就是说,pickle 可以实现 Python 对象的存储及恢复. 序 ...

最新文章

  1. 多线程导出excel_【开源资讯】MyExcel 3.7.0 发布,屏蔽多线程处理细节
  2. java 取日期_java取的日期的操作
  3. STM32看门狗总结
  4. 节点+Executor+Core+Task+Partition+RDD+job+DAG+stage+action算子之间的数量关系+两种并行度的区别
  5. mysql面试吗hi提_面试必备的10道MySQL题
  6. 各种系统程序更新链接
  7. 全面整理(随时更新)
  8. IO负载高的来源定位 IO系列
  9. spring源码-第四个后置处理器
  10. 正点原子STM32串口例程解析
  11. 如何让研发薪酬更具有吸引力?华为、阿里、腾讯的方法值得借鉴
  12. 基于STM32的自由度云台运动姿态控制系统
  13. 来吧,我和你聊聊操作系统
  14. 路侧停车系统有利有弊
  15. win无线网卡怎么进入监听模式_win10系统卸载网卡驱动的操作方法
  16. 台式计算机网络共享,笔记本(通过网线)共享给台式机上网
  17. C++ Primer Plus习题及答案-第五章
  18. tcp伪报头_TCPUDP伪首部详解
  19. 机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照
  20. Android免费小说阅读器—程序员自己的阅读器,没广告,所有小说可搜索,专注阅读体验

热门文章

  1. 如何消费WCF Data Services定义的服务操作
  2. C#中的空值的判断(转)
  3. 电脑键盘功能介绍_远程操控软件介绍
  4. 服务器硬件电路设计书籍,家庭网关硬件接口电路设计大全——电路精选(3)...
  5. java基础入门课后习题_《Java基础入门》课后习题及答案
  6. vivo自带便签新版_vivo手机笔记在哪里及如何用vivo手机做笔记?
  7. html盒子阴影的语法,css3 盒阴影box-shadow
  8. 请写出sfr和sbit的语句格式_单片机c语言的sbit和sfr
  9. html class css,div id class
  10. MATLAB表白利器