Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
作者:cangmean 发布时间:2023-08-18 14:38:24
标签:Python,浅拷贝,深拷贝
程序中常常需要复制一个对象, 按思路应该是这样的
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


猜你喜欢
- 本文主要研究的是Django中migrate和makemigrations的差别,具体如下。在你改动了 model.py的内容之后执行下面的
- 第一步,修改工厂函数,配置邮件参数from flask import Flaskfrom config import Configfrom
- <?php // fix 404 pages: header('HTTP/1.1 200 OK'); // set 4
- MSSQL SERVER 2005 数学函数 1.求绝对值 ABS() select FWeight-50,ABS(FWeight-50),
- kmp算法KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特
- 我们假设TPCoins的发起人最初向已知客户 Dinesh 发出500个TPCoins.为此,他首先创建一个Dinesh
- 类型转换和类型断言类型转换语法:Type(expression)类型断言语法为:expression.(Type)1.类型转换示例代码pac
- CSV文件是一种纯文本文件,它使用特定的结构来排列表格数据。CSV文件内容看起来应该是下面这样的:column 1 name,column
- CI框架自带的zip类简单实用,本文就来简单说一下CI框架的zip类的使用。首先需要导入zip类:$this->load->(&
- 目录1、面向对象基本概念1.1 万物皆对象1.2 面向对象编程1.3 面向对象的特征2、Python面向对象的术语3、Python类的构建3
- 前言首先图片格式转换的方法有很多,但是转二进制字节流的,我搜了一下午终于在 stackoverflow上搜到了 说一下为什么要在线转这个图片
- 本文试图从iPhone的角度结合一些iPhone平台项目的设计经验提炼出iPhone平台的一些优秀设计思路,以供大家在做移动互联网设备设计时
- 问题:python+Flask 反复调用model报错ValueError: Tensor Tensor("dense_2/Sof
- what's the math 模块Python math 模块提供了许多对浮点数的数学运算函数。需要注意的是,这些函数一般是对平台
- 一、ASP的平反想到ASP 很多人会说 “asp语言很蛋疼,不能面向对象,功能单一,很多东西实现不了” 等等诸如此类。 以上说法都是错误的,
- 啥也不说了,大家还是直接看图吧!补充知识:python http request header主要内容http request 请求头主要包
- 环境:MacOS_Cetalina_10.15.1、Mysql8.0.18、Docker_2.0.0.31、docker仓库搜索mysqld
- 前言:存储引擎是数据库的核心,对于 MySQL 来说,存储引擎是以插件的形式运行的。虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属
- 一步步教你怎么用Python画雪人,进一步熟悉Python的基础画图操作,废话不多说,上代码。希望您给个关注给个赞,也算对我们的支持了。cl
- 记录训练过程history=model.fit(X_train, Y_train, epochs=epochs,batch_size=bat