Python中的复制操作及copy模块中的浅拷贝与深拷贝方法

 更新时间:2016年07月02日 10:50:26   作者:cangmean  
浅拷贝和深拷贝是Python基础学习中必须辨析的知识点,这里我们将为大家解析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

相关文章

  • 详解Python3序列赋值、序列解包

    详解Python3序列赋值、序列解包

    这篇文章主要介绍了Python3序列赋值、序列解包的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Python魔法方法功能与用法简介

    Python魔法方法功能与用法简介

    这篇文章主要介绍了Python魔法方法功能与用法,结合具体实例形式分析了Python面向对象程序设计中魔法方法的概念、功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
    2019-04-04
  • Python连接Postgres/Mysql/Mongo数据库基本操作大全

    Python连接Postgres/Mysql/Mongo数据库基本操作大全

    在后端应用开发中,经常会用到Postgres/Mysql/Mongo这三种数据库的基本操作,今天小编就给大家详细介绍Python连接Postgres/Mysql/Mongo数据库基本操作,感兴趣的朋友一起看看吧
    2021-06-06
  • Python生态圈图像格式转换问题(推荐)

    Python生态圈图像格式转换问题(推荐)

    在Python生态圈里,最常用的图像库是PIL——尽管已经被后来的pillow取代,但因为pillow的API几乎完全继承了PIL,所以大家还是约定俗成地称其为PIL。这篇文章主要介绍了Python生态圈图像格式转换问题,需要的朋友可以参考下
    2019-12-12
  • python中利用队列asyncio.Queue进行通讯详解

    python中利用队列asyncio.Queue进行通讯详解

    asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。 下面这篇文章主要给大家介绍了关于python中利用队列asyncio.Queue进行通讯的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2017-09-09
  • win7下python3.6安装配置方法图文教程

    win7下python3.6安装配置方法图文教程

    这篇文章主要为大家详细介绍了win7下python3.6安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • python3读取csv和xlsx文件的实例

    python3读取csv和xlsx文件的实例

    今天小编就为大家分享一篇python3读取csv和xlsx文件的实例,具有很好的参考价值,希望对的大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python3中for循环踩过的坑记录

    python3中for循环踩过的坑记录

    这篇文章主要给大家介绍了python3中for循环踩坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Python Pygame实现俄罗斯方块

    Python Pygame实现俄罗斯方块

    这篇文章主要为大家详细介绍了Python Pygame实现俄罗斯方块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-02-02
  • Python IDE Pycharm中的快捷键列表用法

    Python IDE Pycharm中的快捷键列表用法

    在本篇文章里小编给大家整理的是关于Python IDE Pycharm中的快捷键列表用法,需要的朋友们收藏下
    2019-08-08

最新评论