免费资源网,https://freexyz.cn/

一、深复制与浅复制

列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制

首先看代码:

l1 = [5, 4, 3, 2, 1]

# 用两种方法实现对列表l1的拷贝

l2 = l1

l3 = l1[:]

print(l1) # [5, 4, 3, 2, 1]

print(l2) # [5, 4, 3, 2, 1]

print(l3) # [5, 4, 3, 2, 1]

#修改l1

l1[0] = 9

print(l1) # [9, 4, 3, 2, 1]

print(l2) # [9, 4, 3, 2, 1]

print(l3) # [5, 4, 3, 2, 1]

我们发现修改l1的第一个元素后,l2的第一个元素跟着改变,而l3并没有发生变化。Python内置函数id()可以返回元素的地址,那么我们使用这个函数来看一下三个列表的地址:

print(id(l1)) # 2927957162504

print(id(l2)) # 2927957162504

print(id(l3)) # 2927923243528

从结果来看,l1和l2地址是一样的,也就是说l1和l2指向的是同一块内存区域,显然,通过 l2 = l1 操作,l1和l2都成了指向同一块内存地址的“指针”,也就是说这个操作是为l1取了一个别名,也可以说l2是l1的一个引用。用一张图来解释:

那么修改l1也就是在修改l2:

接下来看一下创建l3的过程,l3 = l1[:] ,这是将l1进行切片,并将切片后的列表拷贝到l3所指向的内存区域,同样看图:

也就是说l1和l3指向不同的内存区域,那么修改l1并不会影响到l3:

通俗的来讲,像l2这种,拷贝出来的对象和原对象的地址相同,为浅复制,像l3这种,分配新的内存空间并拷贝原始内容的,拷贝出来的对象和原对象的地址不同,为深复制。

二、复制列表内元素的浅复制

在复制列表中的所有元素的时候,进行浅复制

看一个比较有意思的东西,看代码:

l1 = [1,2,3,[1,3]]

l2 = l1[:]

l1[3][1] = 9

print(l1) # [1, 2, 3, [1, 9]]

print(l2) # [1, 2, 3, [1, 9]]

按照前面的理解,修改l1某个元素后,l2应该不会发生改变,可结果却与我们预想的结果大相径庭,于是,我们不得不思考一下l2深复制到底复制了什么东西。实际上列表其实可以理解为一个“指针”,l1[3]是一个列表元素,l2[3]也是一个列表元素,执行以下代码:

print(id(l2[3])) # 2014816956232

print(id(l1[3])) # 2014816956232

我们发现l1[3]和l2[3]指向的地址是一样的,也就是说在执行 l2 = l1[:] 的时候,将一个地址拷贝了,所以修改l1[3]相当于修改l2[3],所以才会出现上述结果,这更加说明了列表其实就是一个指向一片内存区域的“指针”。那么我们是不是可以说列表l2深复制l1,但是对列表中每个元素进行复制时进行的是浅复制呢?答案显而易见。

修改l1[3]中的元素:

三、copy()和deepcopy()

copy模块可以帮助我们实现对象的复制操作

列举一下其他的拷贝列表的方式:

l4 = l1 * 1

print(id(l4)) # 2927957916296

l5 = list(l1)

print(id(l5)) # 2927957767816

import copy

l6 = copy.copy(l1)

print(id(l6)) # 2927956854024

l7 = copy.deepcopy(l1)

print(id(l7)) # 2927958503368

我们可以看到,这几种拷贝方式所得到的的新对象与原对象的地址都不相同了,并没有按照字面意思(copy进行浅复制,deepcopy进行深复制),那么copy()和deepcopy()究竟有什么区别呢,继续看代码:

list1 = [1,2,3,[1,3]]

list2 = list1[:]

list3 = copy.copy(list1)

list4 = copy.deepcopy(list1)

list1[3][0] = 9

print(list1) # [1, 2, 3, [9, 3]]

print(list2) # [1, 2, 3, [9, 3]]

print(list3) # [1, 2, 3, [9, 3]]

print(list4) # [1, 2, 3, [1, 3]]

print(id(list1[3])) # 2927923172616

print(id(list2[3])) # 2927923172616

print(id(list3[3])) # 2927923172616

print(id(list4[3])) # 2927967190728

可以发现copy()和前面提到的用 [:] 进行拷贝没有本质上的区别,对列表中的每个元素进行复制时进行的是浅拷贝,而deepcopy()在复制列表中的每个元素的时候,进行的是深拷贝。

免费资源网,https://freexyz.cn/

python list 深复制_Python列表的深复制和浅复制示例详解相关推荐

  1. python列表浅复制_Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用 ...

  2. 深度复制_Python 列表切片陷阱:引用、复制与深复制

    Python 列表的切片和赋值操作很基础,之前也遇到过一些坑,以为自己很懂了.但今天刷 Codewars 时发现了一个更大的坑,故在此记录. Python 列表赋值:复制"值"还是 ...

  3. python处理列表中字典_Python 列表、元组、字典及集合操作详解

    一.列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1.创建列表 ...

  4. python抽奖滚动界面_Python使用Tkinter实现转盘抽奖器的步骤详解

    我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器. 滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中 ...

  5. python 录制web视频_Python django框架 web端视频加密的实例详解

    视频加密流程图: 后端获取保利威的视频播放授权token,提供接口api给前端 参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play ...

  6. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  7. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  8. python中英文字频率_python实现统计文本中单词出现的频率详解

    本文实例为大家分享了python统计文本中单词出现频率的具体代码,供大家参考,具体内容如下 #coding=utf-8 import os from collections import Counte ...

  9. python列表的排序方法是_Python列表排序 reverse、sort、sorted 操作方法详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

最新文章

  1. 常考数据结构与算法: NC19 连续子数组的最大和
  2. Java学习笔记(九)--数组及Arrays类
  3. 登陆工行网上银行报60058017错误及输入正确网银密码提示密码不正确
  4. NodeJs系列二:你好,世界
  5. [转载] JAVA泛型杂谈--擦除,协变,逆变,通配符等
  6. 《Python编程从入门到实践》记录之列表解析
  7. 查看局域网内所有ip 和 mac
  8. 计算机的二进制,十六进制等的数值概念
  9. 【BZOJ3991】寻宝游戏(动态规划)
  10. python查看opencv版本_如何在Python和C ++中输出OpenCV版本号
  11. 苹果ipad邮箱找不到服务器,ipad怎么设置qq邮箱?苹果ipad qq邮箱设置教程
  12. 一个便捷的在线取色器工具
  13. 十进制转二进制c语言递归,【数据结构】求十进制转二进制的递归算法
  14. gif表情制作软件怎么制作gif动图
  15. root高级权限怎么弄,怎样拥有root权限
  16. 前端页面img标签图片显示发生错误或者没有图片都显示默认的图片
  17. NAS如何进行磁盘碎片整理?
  18. (NeurIPS 2019) Learning Object Bounding Boxes for 3D Instance Segmentation on Point Clouds
  19. ROS项目开发流程、框架
  20. 浅谈微信小程序对于创业者,意味着什么?

热门文章

  1. 从运维的角度理解Iaas、Paas、Saas云计算
  2. 图形—9patch,shape ,selector
  3. handlersocket安装配置
  4. [公告] TechNet / MSDN 经理人博客上周移机整合暂断
  5. C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\文件不断增长,如何处理?...
  6. OAuth2.0网页授权 提示未关注该测试号
  7. Spring注入日期到bean属性-CustomDateEditor
  8. 网站设计常用技巧收集
  9. 关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError No module named _ctypes 的解决办法
  10. 15个最受欢迎的Python开源框架(转载)