Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
程序中常常需要复制一个对象, 按思路应该是这样的
a = [1, 2, 3] b = a # [1, 2, 3] print b
已经复制好了,但是现在得改变一下第一个元素的值把它改成5
b[0] = 5 # [5, 2, 3] print b # [5, 2, 3] print a
我改变了b的第一个元素的值,但是a的值也改变了,这是因为python中的=是引用.a和b指向的是相同的列表,所以改变列表会出现以上的结果.
解决方法是切片操作
a = [1, 2, 3] b = a[:] b[0] = 4 # [1, 2, 3] # [4, 2, 3] print a print b
但是在嵌套列表的时候呢,试一试
a = [[1,2,3], 4, 5] b = a[:] b[1] = 0 # [[1,2,3], 4, 5] # [[1,2,3], 0, 5] print a print b
恩!没什么问题,在试一试嵌套列表元素
a = [[1,2,3], 4, 5] b = a[:] b[0][0] = 5 # [[5,2,3], 4, 5] # [[5,2,3], 4, 5] print a print b b = a[:]
a的值还是改变了,切片复制只对该对象进行拷贝不会对子元素进行拷贝
copy 模块
copy模块用于对象的拷贝操作。该模块非常简单,只提供了两个主要的方法: copy.copy 与 copy.deepcopy ,分别表示浅复制与深复制。什么是浅复制,什么是深复制,网上有一卡车一卡车的资料,这里不作详细介绍。复制操作只对复合对象有效。用简单的例子来分别介绍这两个方法。
浅复制只复制对象本身,没有复制该对象所引用的对象。
#coding=gbk import copy l1 = [1, 2, [3, 4]] l2 = copy.copy(l1) print l1 print l2 l2[2][0] = 50 print l1 print l2
结果:
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [50, 4]] [1, 2, [50, 4]]
同样的代码,使用深复制,结果就不一样:
import copy l1 = [1, 2, [3, 4]] l2 = copy.deepcopy(l1) print l1 print l2 l2[2][0] = 50 print l1 print l2
结果:
[1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [3, 4]] [1, 2, [50, 4]]
改变copy的默认行为
在定义类的时候,通过定义__copy__和__deepcopy__方法,可以改变copy的默认行为。下面是一个简单的例子:
class CopyObj(object): def __repr__(self): return "CopyObj" def __copy__(self): return "Hello" obj = CopyObj() obj1 = copy.copy(obj) print obj print obj1
结果:
CopyObj Hello
相关推荐
-
Python基础教程之浅拷贝和深拷贝实例详解
Python基础教程之浅拷贝和深拷贝实例详解 网上关于Python的深拷贝和浅拷贝的文章很多,这里对三种拷贝进行比较并附实例,大家可以参考下 一般的复制 #encoding:utf-8 #定义一个嵌套集合 lista=[1,2,3,[4,5,6,[7,8,9]]] listb=lista #分别打印出 lista和listb的地址值 print id(lista) #4511103096 print id(listb) #4511103096 #修改lista中的内容,li
-
Python中的赋值、浅拷贝、深拷贝介绍
和很多语言一样,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式. 在学习过程中,一开始对浅拷贝理解很模糊.不过经过一系列的实验后,我发现对这三者的概念有了进一步的了解. 一.赋值 赋值算是这三种操作中最常见的了,我们通过一些例子来分析下赋值操作: str例 复制代码 代码如下: >>> a = 'hello' >>> b = 'hello' >>> c = a >>> [id(x) for x in
-
浅谈Python浅拷贝、深拷贝及引用机制
这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下 前续 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表list对象,在Python中,这样的赋值语句,其实内部含义是指a指向这个list所在内存地址,可以看作类似指针的概念. 而b,注意,他是把a对象包裹进一个list,并且乘以5,所以b的样子应该是一个大list,里面元素都是a 而当a对象进行了append操作后,其实,隐含的意思是,内存中的这个l
-
Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标示符 复制代码 代码如下: # encoding=UTF-8 obj = ['name',['age',18]] a=obj[:] b=list(obj) for x in obj,a,b: print id(x) 35217032 35227912 29943304 他们的id都不同,按照正
-
深入理解python中的浅拷贝和深拷贝
在讲什么是深浅拷贝之前,我们先来看这样一个现象: a = ['scolia', 123, [], ] b = a[:] b[2].append(666) print a print b 为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用. 所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a. a = ['scolia', 123, [], ] b = a[:] print id(a), id(a[0]), id(
-
Python中的深拷贝和浅拷贝详解
要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型 来确认变量到底是什么类型. 单独赋值: 比如说: 复制代
-
Python浅拷贝与深拷贝用法实例
本文实例讲述了Python浅拷贝与深拷贝用法.分享给大家供大家参考.具体分析如下: >>> person=['name',['savings',100]] >>> hubby=person[:] >>> wifey=list(person) >>> [id(x) for x in person,hubby,wifey] [3074051788L, 3074061740L, 3074061996L] >>> [id(y
-
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.2. copy.deepcopy 深拷贝 拷贝对象及其子对象一个很好的例子: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->import copya = [1, 2, 3, 4, ['a', 'b']] #原始对象b = a #赋值,传对象的引用c = copy.c
-
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
程序中常常需要复制一个对象, 按思路应该是这样的 a = [1, 2, 3] b = a # [1, 2, 3] print b 已经复制好了,但是现在得改变一下第一个元素的值把它改成5 b[0] = 5 # [5, 2, 3] print b # [5, 2, 3] print a 我改变了b的第一个元素的值,但是a的值也改变了,这是因为python中的=是引用.a和b指向的是相同的列表,所以改变列表会出现以上的结果. 解决方法是切片操作 a = [1, 2, 3] b = a[:] b[0]
-
python copy模块中的函数实例用法
1.copy.copy()函数可用于复制列表或字典等可变值,复制后的列表和原列表是两个独立的列表. import copy origin = [1,2,3] new = copy.copy(origin) new[0] = 0 print("origin = ",origin) print("new = ",new) 2.如果要复制的列表中有列表,则使用deepcopy()函数完全复制. import copy origin =[[1,2,3],['a','b','
-
Python中使用copy模块实现列表(list)拷贝
引用是指保存的值为对象的地址.在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些.下面举个例子: 问题描述:已知一个列表,求生成一个新的列表,列表元素是原列表的复制 复制代码 代码如下: a=[1,2] b=a 这种做法其实并未真正生成一个新的列表,b指向的仍然是a所指向的对象.这样,如果对a或b的元素进行修改,a,b的值同时发生变化. 解决的方法为: 复制代码 代码如下: a=[1,2] b=a[:] 这样修改a对b没有影响.修改
-
Python的math模块中的常用数学函数整理
在数学之中,除了加减乘除四则运算之外--这是小学数学--还有其它更多的运算,比如乘方.开方.对数运算等等,要实现这些运算,需要用到 Python 中的一个模块:Math 模块(module)是 Python 中非常重要的东西,你可以把它理解为 Python 的扩展工具.换言之,Python 默认情况下提供了一些可用的东西,但是这些默认情况下提供的还远远不能满足编程实践的需要,于是就有人专门制作了另外一些工具.这些工具被称之为"模块" 任何一个 Pythoner 都可以编写模块,并且把这
-
详解Python列表赋值复制深拷贝及5种浅拷贝
概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新列表 l1 = [1, 2, 3, 4, 5] # 对l2赋值 l2 = l1 print(l1) l2[0] = 100 print(l1) 示例结果: [1, 2, 3, 4, 5] [100, 2, 3, 4, 5] 可以看到,更改赋值后的L2后L1同样也会被更改,看似简单的"复制"
-
详解Python核心编程中的浅拷贝与深拷贝
一.问题引出浅拷贝 首先看下面代码的执行情况: a = [1, 2, 3] print('a = %s' % a) # a = [1, 2, 3] b = a print('b = %s' % b) # b = [1, 2, 3] a.append(4) # 对a进行修改 print('a = %s' % a) # a = [1, 2, 3, 4] print('b = %s' % b) # b = [1, 2, 3, 4] b.append(5) # 对b进行修改 print('a = %s'
-
Python的shutil模块中文件的复制操作函数详解
copy() chutil.copy(source, destination) shutil.copy() 函数实现文件复制功能,将 source 文件复制到 destination 文件夹中,两个参数都是字符串格式.如果 destination 是一个文件名称,那么它会被用来当作复制后的文件名称,即等于 复制 + 重命名.举例如下: >> import shutil >> import os >> os.chdir('C:\\') >> shutil.co
-
python中操作文件的模块的方法总结
在python中操作文件算是一个基本操作,但是选对了模块会让我们的效率大大提升.本篇整理了两种模块的常用方法,分别是os模块和shutil模块.相信这两种模块大家在之间的学习中有所涉及,那么关于具体的文件操作部分,我们一起往下看看都有哪些方法和实例吧. 本教程操作环境:windows7系统.Python3版.Dell G3电脑. Python对文件操作采用的统一步骤是:打开-操作-关闭. 一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法 1.得到当前工作目录,即
-
python shell命令行中import多层目录下的模块操作
首先在文件夹中添加_init_.py文件,即使是空文件也可以,多层文件夹,每层文件夹中都要添加. 比如我要import,a文件夹中,b文件夹下的 c.py 我就需要在a,b文件夹中都添加_init_.py文件. 然后引入方式:import a.b.c 然后在调用c.py的函数时,直接c.f()是不行的,需要a.b.c.f(). 当然也可以先写 c = a.b.c,然后再c.f(). 补充知识:Python IDLE shell中引入模块 安装了Python之后,会自带一个Python IDLE,
随机推荐
- Angularjs的$http异步删除数据详解及实例
- SQLyog.Enterprise.7.02注册码附注册机下载
- Spring Boot定时任务的使用实例代码
- asp.net XML文件操作实现代码
- js/jq仿window文件夹框选操作插件
- PHP基于curl后台远程登录正方教务系统的方法
- php 缓存函数代码
- 基础的十进制按位运算总结与在Python中的计算示例
- 一段多浏览器的"复制到剪贴板"javascript代码
- asp实现生成由数字,大写字母,小写字母指定位数的随机数
- Windows Powershell 别名
- 控制输出颜色的shell脚本
- 在sql中不指定Order by排序是按照主键吗
- jQuery与其它库冲突的解决方法
- Android Rreact Native 常见错误总结
- Android实现沉浸式通知栏通知栏背景颜色跟随app导航栏背景颜色而改变
- 基于C++中覆盖,重载,隐藏的一点重要说明
- 非常不错的功能强大代码简单的管理菜单美化版
- PHP foreach遍历多维数组实现方式
- PHP多维数组排序array详解