python中list.copy方法用法浅谈

2023-11-05

 

本文主要给大家介绍了关于python中list.copy方法使用的相关资料,文中还介绍了python list.copy() 和 copy.deepcopy()区别,需要的朋友可以参考下

当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时,可能会遇到一些问题

1

2

3

4

5

# _*_coding='utf8'_*_

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

nameList1 = nameList.copy()

nameList[1] = 55

print(nameList, nameList1)

此时打印出nameList和nameList1时,两个列表的元素是下面这样

[1, 55, 3, 4, 5] [1, 2, 3, 4, 5]

可以看到列表的第二个元素不一样

这是因为在python中list.copy()这个函数在执行的时候,指向的不是nameList在内存中的地址,而是重新复制了一份,此时两个列表在内存中的地址不同,我们可以打印出来看看

使用如下代码可以见到,两个列表的内存已经有差别了

1

2

3

4

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

nameList1 = nameList.copy()

nameList[1] = 55

print(id(nameList), id(nameList1))

2207528867520 2207531826048

此时修改的nameList[1] = 55并不会在nameList1中生效

而当nameList中又存在数组时,情况又会发生变化

1

2

3

4

5

# _*_coding='utf8'_*_

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

nameList1 = nameList.copy()

nameList[3][2] = 55

print(nameList, nameList1)

输入如下内容

[1, 2, 3, [3, 4, 55], 4, 5] [1, 2, 3, [3, 4, 55], 4, 5]

可以看到两个list中嵌套的数组都发生了变化,这是因为在列表中存放的二维列表,实际上存放的是二维列表在内存中的地址,当修改其中一个列表,另外一个自然也会受到影响,那么,让我们来验证一下是不是存放的内存地址。

同样的,我们使用id()这个方法来取出内存地址

1

2

3

4

5

# _*_coding='utf8'_*_

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

nameList1 = nameList.copy()

nameList[3][2] = 55

print(id(nameList[3]), id(nameList1[3]))

输出如下内容

2879859422336 2879859422336

可以看到,两个内存地址是相同的

copy方法介绍到此结束

补充:python list.copy() 和 copy.deepcopy()区别

举个例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import copy

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

    def __repr__(self):

        return str(self.val)

list1 = [ListNode(1), ListNode(2)]

list2 = list1.copy()

list3 = list1[:]

list4 = copy.deepcopy(list1)

print(list1, list2, list3, list4)

# [1, 2] [1, 2] [1, 2] [1, 2]

list1[0].val = 5

print(list1, list2, list3, list4)

# [5, 2] [5, 2] [5, 2] [1, 2]

list1.append(ListNode(10))

print(list1, list2, list3, list4)

# [5, 2, 10] [5, 2] [5, 2] [1, 2]

print(id(list1[0]),id(list2[0]),id(list3[0]),id(list4[0]))

# 1984073709792 1984073709792 1984073709792 1984073707824

解释

  • list1 是原数组
  • list2 和 list3 都是list1的浅拷贝,浅拷贝到底是什么意思?

python的list里面存的都是引用,如果存的是listnode,实际上存的是listnode的引用,也就是地址,毕竟如果listnode里存了很多关于这个node的信息的话,直接在list里面存这段信息的地址就很方便,等到要用这段信息的时候(比如list1[0].val),只要找到地址(list1[0])再到这段地址取值(.val)就可以了。

浅拷贝的意思是,开辟一段内存,这段内存里复制了原list的地址。

地址还是那个地址,所以可以看出**id(list1[0]),id(list2[0])**是完全一样的。这会带来的问题是,当我们把这段地址里的值.val变化一下(list1[0].val = 5), 浅拷贝的数组里对应元素的值也就跟着变了

深拷贝就厉害了,不光把原数组存的地址拷贝了,就连原数组地址里对应的数据也都进行了复制,所以可以看到**id(list1[0]),id(list4[0])**变得不一样了。

转自:微点阅读   https://www.weidianyuedu.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中list.copy方法用法浅谈 的相关文章

随机推荐

  • vue踩坑记录—elementui样式引入失败

    出现的问题 F12没有任何报错 elementui可以引入组件 但是组件的样式不显示 首先检查项目的插件和依赖是否安装 命令行运行vue ui 在可视化界面里可以安装 插件 vue cli plugin element 依赖 开发依赖 el
  • java 附近的人

    传送门 思路清晰 详述了坐标取附近的人的功能
  • 论文参考文献插入方法(一)

    本文使用的是word2016 word2010及以上操作方法应该相同 第一步 参考文献编号 首先在 参考文献 字后面新起一行 从 开始 里面选择 插入编号 选择圆圈中的那种编号格式 参考文献的编号格式 这是就会自动出现编号 1 插入文献后回
  • Python爬虫副业真的可行吗?能赚多少?

    首先回答你 python爬虫能当副业 副业的方式比较多 等下我会讲几种 到哪个层次能接单 主要看你是接什么样的单 爬一些资料 视频这种简单的学一两个月就没什么问题 复杂的那就需要系统的学习 爬虫原理 html相关知识 urllib urll
  • python实现爬取微博相册所有图片

    微博相册的批量爬取 文章目录 前言 一 分析实现思路 二 编写代码 1 引入库 2 多进程的编写 3 主函数的编写 结果 前言 微博有相册功能 那么我们如何批量下载相册中的所有照片呢 提示 以下是本篇文章正文内容 下面案例可供参考 一 分析
  • python中统计单词出现的次数_python统计文本中每个单词出现的次数

    python统计文本中每个单词出现的次数 coding utf 8 author zcg import collections import os with open abc txt as file1 打开文本文件 str1 file1 r
  • myBatis入门程序介绍

    前言 Mybaits框架也称为对象关系映射 ORM 框架 它通过描述java对象与数据库表之间映射关系 自动的将java应用程序中的对象持久化到关系型数据库中 这些功能的完成主要依赖两种配置文件 主配置文件 通常叫做 mybaits con
  • 【云原生之Docker实战】使用docker部署mm-wiki文档系统

    云原生之Docker实战 使用docker部署mm wiki文档系统 一 mm wiki介绍 1 mm wiki简介 2 mm wiki特点 二 检查本地docker环境 1 检查本地docker版本 2 检查docker状态 3 检查do
  • 京东到家技术解密

    京东到家技术解密 京东到家相信很多人都听过 是一个短短两年内依靠技术与产品崛起的公司 其中项目的划分 技术的选型又是怎么样子呢 本课程目标用户群体是工作过几年的攻城狮 在项目中取得了一定的成就 但是缺少O2O 电商 新零售领域的工作经验 却
  • oracle存储过程----case条件控制语句的用法

    上一篇 oracle存储过程 赋值 相等 分支的写法 oracle存储过程 case条件控制语句的用法 今天又看到了另一种条件控制的方法case case语句可以分为两种类型 一种是简单的case语句 它给出一个表达式 并把表达式结果同提供
  • Vue + EChart之饼图详解

    Vue EChart之饼图详解 1 安装echarts项目依赖 npm install echarts save 或者 npm install echarts S 2 创建图表
  • 为什么需要三次握手?

    为什么需要三次握手 三次握手保证了数据能在收发双方之间传递接收 三次握手最主要的目的就是 双方确认 自己与对方的发送和接收是正常的 第一次握手 客户端什么也确定不了 服务端确认了对方发送正常 自己接收正常 第二次握手 客户端 确认了自己发送
  • 【20220815】新板子第一次调试的错误大多是硬件的疏忽

    1 看门狗没有按照外设芯片的要求接VDD 而是被硬件工程师NC处理了 2 拨码开关输入没有进行上拉处理 3 连接器P3没有GND端口 Layout没问题 主要是硬件工程师绘制原理图的时候的一些判断上的问题 当他不知道项目需要什么接线方法的时
  • Python3之面向对象

    一 面向对象技术简介 类 class 用来描述具有相同属性和方法的对象集合 定义了该集合中每个对象所共有的属性和方法 对象是类的实例 方法 即类中定义的函数 类变量 类变量即在类中声明的变量 其在整个实例化的对象中是公用的 类变量定义在类中
  • MVSNet (pytorch版) 搭建环境 运行dtu数据集重建 实操教程(图文并茂、超详细)

    文章目录 1 准备工作 1 1 下载源码 1 2 测试集下载 2 配置环境 3 dtu数据集 重建演示 3 1 重建效果查看 4 补充解释 4 1 bash 脚本文件超参数解释 4 2 lists dtu解释 5 Meshlab查看三维点云
  • angular基础5-8【指令&管道&组件通讯&组件生命周期】

    5 指令 Directive 指令是 Angular 提供的操作 DOM 的途径 指令分为属性指令和结构指令 属性指令 修改现有元素的外观或行为 使用 包裹 结构指令 增加 删除 DOM 节点以修改布局 使用 作为指令前缀 5 1 内置指令
  • 小程序用什么开发?

    近年来 随着智能手机的普及和移动互联网的发展 小程序成为了一种备受关注的新型应用 那么 小程序用什么开发呢 首先 小程序可以使用多种技术进行开发 其中比较流行的有两种方式 一种是借助微信开发者工具使用各种前端框架和语言进行开发 另一种是使用
  • Unity通过Addressable + ILRuntime 实现代码和资产的热更新(案例+图文详情+源码)

    Unity通过Addressable ILRuntime 实现代码和资产的热更新 图文详情 源码 前言 一 思路概述 二 Unity主工程部分 1 GameLunch的源码 2 ResMgr的源码 3 ILRuntimeWrapper的源码
  • spark报错:ROW FORMAT SERDE is incompatible with format ‘orc‘

    错误样例 CREATE TABLE wangriyu bugtt1 task no int exec ip int ROW FORMAT SERDE org apache hadoop hive ql io orc OrcSerde STO
  • python中list.copy方法用法浅谈

    本文主要给大家介绍了关于python中list copy方法使用的相关资料 文中还介绍了python list copy 和 copy deepcopy 区别 需要的朋友可以参考下 当我们想复制两个一模一样的列表时 我们可能使用到list