深入理解python中的浅拷贝和深拷贝

 更新时间:2016年05月30日 16:58:09   投稿:jingxian  
下面小编就为大家带来一篇深入理解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(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

代码验证无误,所以虽然a和b是两个不同的对象,但是里面的引用都是一样的。这就是所谓新的对象,旧的内容。

但是,浅拷贝还不仅如此,看下面:

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print a
print b

这又是怎么回事呢?

看过我在python变量赋值说明的同学会知道:对于字符串、数字等不可变的数据类型,修改就相当于重新赋值。在这里就相当于刷新引用。

代码验证一下:

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

看来是正确的。

上面讲的这些就是浅拷贝,总结起来,浅拷贝只是拷贝了一系列引用,当我们在拷贝出来的对象对可修改的数据类型进行修改的时候,并没有改变引用,所以会影响原对象。而对不可修改的对象进行修改的是,则是新建了对象,刷新了引用,所以和原对象的引用不同,结果也就不同。

创建浅拷贝的方法:

1.切片操作

2.使用list()工厂函数新建对象。( b = list(a) )

那么深拷贝不就是将里面引用的对象重新创建了一遍并生成了一个新的一系列引用。

基本上是这样的,但是对于字符串、数字等不可修改的对象来说,重新创建一份似乎有点浪费内存,反正你到时要修改的时候都是新建对象,刷新引用的。所以还用原来的引用也无所谓,还能达到节省内存的目的。

看下代码验证:

from copy import deepcopy
a = ['scolia', 123, [], ]
b = deepcopy(a)
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

验证正确。

深拷贝的创建:

1.正如代码示例用一样,只能通过内置的copy模块的deepcopy()方法创建。

好了,关于深浅拷贝的问题就先说到这里,有什么错误或需要补充的以后会继续。

以上这篇深入理解python中的浅拷贝和深拷贝就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python的bit_length函数来二进制的位数方法

    Python的bit_length函数来二进制的位数方法

    今天小编就为大家分享一篇Python的bit_length函数来二进制的位数方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python去除列表中的空值元素实战技巧

    python去除列表中的空值元素实战技巧

    这篇文章主要介绍了python实战技巧之去除列表中的空值元素,搜集针对python高效处理数据的核心代码,今天是实现去除列表中的空值元素,需要的朋友可以参考下
    2023-02-02
  • PyQt5结合QtDesigner实现文本框读写操作

    PyQt5结合QtDesigner实现文本框读写操作

    本文将结合实例代码,介绍PyQt5结合QtDesigner实现文本框读写操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • Django cookie和session的应用场景及如何使用

    Django cookie和session的应用场景及如何使用

    今天我们来重点看下Django中session和cookie的用法吧。我们会介绍cookie和session的工作原理,还会分享实际应用的案例。
    2021-04-04
  • python必备库Matplotlib画图神器

    python必备库Matplotlib画图神器

    这篇文章主要介绍了python必备库Matplotlib画图神器,Matplotlib 是 Python 中最受欢迎的数据可视化软件包之一,支持跨平台运行,它是 Python 常用的 2D 绘图库,同时它也提供了一部分 3D 绘图接口,更多详细内容,需要的小伙伴可以参考一下下面文章具体内容
    2022-03-03
  • Scrapy的简单使用教程

    Scrapy的简单使用教程

    Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。
    2017-10-10
  • python安装cxOracle避坑总结不要直接pip install

    python安装cxOracle避坑总结不要直接pip install

    这篇文章主要为大家介绍了python安装cx_Oracle是遇到的一些问题的解决办法的总结,来帮大家避避坑有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2021-10-10
  • pyCharm 实现关闭代码检查

    pyCharm 实现关闭代码检查

    这篇文章主要介绍了pyCharm 实现关闭代码检查,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 卡尔曼滤波数据处理技巧通俗理解及python实现

    卡尔曼滤波数据处理技巧通俗理解及python实现

    这篇文章主要为大家介绍了卡尔曼滤波数据处理技巧的通俗理解及python实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • bat和python批量重命名文件的实现代码

    bat和python批量重命名文件的实现代码

    这篇文章主要介绍了bat和python批量重命名文件的实现代码,需要的朋友可以参考下
    2016-05-05

最新评论