python中的copy和deepcopy

2023-11-09

    数据处理经常会用到引用或者赋值,Python中的可变类型变量在操作时需要注意拷贝的方式,特别在实现复杂功能的函数时,一不小心就会改变原来的数据内容。

data = {
    "name":"anne",
    "age":18,
    "scores":{
        "语文":130,
        "数学":150,
        "英语":120}
}
d2 = data
data["age"] = 20 
print(d2) 

d2打印的值里,age是18,还是20?

{'name': 'anne', 'age': 20, 
'scores': {'语文': 130, '数学': 150, '英语': 120}}

为何是20呢?因为d2=data相当于只是拿到了data的内存地址,但data里的每个k,v都是有单独的内存的地址的。d2,data会一直共享这个dict里的数据。

如果只想复制一份完成的dict数据怎么办呢?

可以用浅copy语法

d2 = data.copy()
data["age"] = 20
print(d2)
print(data)
{'name': 'anne', 'age': 18, 
'scores': {'语文': 130, '数学': 150, '英语': 120}}


{'name': 'anne', 'age': 20, 
'scores': {'语文': 130, '数学': 150, '英语': 120}}

但是为什么这个语法叫做浅copy呢?你改一下score里的值 就知道了。

d2 = data.copy()
data["age"] = 20
data["scores"]["数学"] = 99 
print(d2)
print(data)

看输出 , 很神奇,两个Dict里age的值是独立的,但score字典里的分数值貌似是共享的。

{'name': 'anne', 'age': 18, 
'scores': {'语文': 130, '数学': 99, '英语': 120}}


{'name': 'anne', 'age': 20, 
'scores': {'语文': 130, '数学': 99, '英语': 120}}

因为浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份。

深deepcopy

若你想彻底使上面的2个dict完全独立,无论有多少层数据。那就要用python工具包里的一个工具了。

总结:

    一维数组尽量用浅拷贝。

  •  如下形参 x 的改变会影响到原 nums,因为形参 x 虽然名字变了,但实际上还是对原 nums 的引用,他们指向同一内存地址,在调用 addStr(x) 之后原nums 就发生了变化,此时当你想取到元素 3,用 nums[-1] 是错误的,正确做法是先进行浅拷贝:

  • 1. 可以在调用 addStr(nums[:]) 时候就进行浅拷贝。

  • 2. 也可以在执行 addStr(x)时候,先用局部变量做一个浅拷贝。

def addStr(x):
  # x = x[:] # 先用一个局部变量进行浅拷,贝就正确了
  x.append('a')
  nums = [1, 2, 3]
  addStr(nums)
print(nums[-1]) # 'a', 因为此时 nums = [1, 2, 3, 'a']

多维数组的使用尽量用深拷贝

  • 浅拷贝不会拷贝子对象,所以对二维数组进行浅拷贝,内部一维数组只是一个引用,还是指向原数组,比如下面的 tmp = nums[:],改变 tmp 子对象的话 nums 依然会发生变化,此时想要不影响原数组,就需要用深拷贝。

nums = [[0] * 3 for _ in range(2)]
tmp = nums[:]
# tmp = copy.deepcopy(nums) # 正确用法
tmp[0][0] = 3
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python中的copy和deepcopy 的相关文章

  • Golang 结构的 XML 和 JSON 标签?

    我有一个可以根据 HTTP 请求标头输出为 JSON 或 XML 的应用程序 我可以通过将正确的标签添加到我正在使用的结构中来实现正确的输出 但我不知道如何为 JSON 和 XML 指定标签 例如 序列化以纠正 XML type Foo s
  • 如何在 Ubuntu 上安装 Python 模块

    我刚刚用Python写了一个函数 然后 我想将其做成模块并安装在我的 Ubuntu 11 04 上 这就是我所做的 创建 setup py 和 function py 文件 使用 Python2 7 setup py sdist 构建分发文
  • 如何更改充当按钮的范围的文本

    我正在为自定义 Web 应用程序编写自动化测试 我遇到了无法更改跨度文本的问题 我尝试过使用 driver execute script 但没有运气 如果我更好地了解 javascript 这确实会有帮助 据我所知 您无法单击跨度 并且列表
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • 在 python-docx 中搜索和替换

    我有一个包含以下字符串的文档 模板 你好 我的名字是鲍勃 鲍勃是一个很好的名字 我想使用 python docx 打开此文档并使用 查找和替换 方法 如果存在 来更改每个字符串 Bob gt Mark 最后 我想生成一个新文档 其中包含字符
  • Python:当前目录是否自动包含在路径中?

    Python 3 4 通过阅读其他一些 SO 问题 似乎如果moduleName py文件位于当前目录之外 如果要导入它 必须将其添加到路径中sys path insert 0 path to application app folder
  • 将 subprocess.Popen 的输出通过管道传输到文件

    我需要启动一些长时间运行的进程subprocess Popen 并希望拥有stdout and stderr从每个自动管道到单独的日志文件 每个进程将同时运行几分钟 我想要两个日志文件 stdout and stderr 每个进程当进程运行
  • 使用 genfromtxt 导入 numpy 中缺失值的 csv 数据

    我有一个 csv 文件 看起来像这样 实际文件有更多的列和行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 假设文件的名称是info csv如果我尝试使用导入它 data numpy genfromtxt i
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 无法从 JQuery ajax 调用接收 JSON

    我已经确定来自服务器的 JSON 是有效的 手动进行 ajax 调用 但我真的很想使用 JQuery 我还使用 firebug 确定发送到服务器的 post URL 是正确的 但是 错误回调仍然被触发 解析错误 我还尝试了数据类型 文本 我
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • 使用 Doc2vec 后如何解释 Clusters 结果?

    我正在使用 doc2vec 将关注者的前 100 条推文转换为矢量表示形式 例如 v1 v100 之后 我使用向量表示来进行 K 均值聚类 model Doc2Vec documents t size 100 alpha 035 windo
  • 将 Scikit-Learn OneHotEncoder 与 Pandas DataFrame 结合使用

    我正在尝试使用 Scikit Learn 的 OneHotEncoder 将 Pandas DataFrame 中包含字符串的列替换为 one hot 编码的等效项 我的下面的代码不起作用 from sklearn preprocessin
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • eventSources 到事件 Json,完整日历

    我正在尝试从 eventSources 获取 json 调用到我的事件 我在 eventSources 中返回的 json 是 title Title Test start 1305841052 当我将此字符串传递到事件中时 它会正确显示日
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • MySQL国内镜像

    一 基础概念 MySQL是一种关系型数据库管理系统 使用标准SQL查询语句进行数据访问 广泛应用于Web系统的数据存储 MySQL国内镜像指的是在国内建立的MySQL镜像站点 用于提供MySQL的各种资源下载和服务 由于MySQL在国内访问
  • A *p=new B;

    好久没有摸c 了 刚刚看到个面试题 发现都要忘了 巩固下 A P new B A是父类 B是子类 虽然P是一个基类的指针 但是new B调用的是派生类B的构造方法 所以构造的是B类对象 先调用A的构造函数 再调用B的构造函数 构造完后会返回
  • 【计算机操作系统】第一章、操作系统引论

    参考书籍为汤老师经典教材 本博客旨在作为自己学习笔记并与大家分享 1 操作系统的目标和作用 1 1 目标 方便 有效 可扩充 开放性 1 2 作用 作为用户和计算机硬件系统之间的接口 用户可以通过1 命令方式2 系统调用方式3 图形 窗口方
  • 生产环境数据库版本太低导致:PostgreSQL - ERROR: could not determine data type of parameter $1

    1 分析 这个问题一般值前端传回来的参数和实体类或者数据库不匹配 2 报错的sql LIKE CONCAT query areaName 3 报错问题 PostgreSQL ERROR could not determine data ty
  • C++不定参数个数函数的写法

    C 不定参数个数的函数比较常见 比如printf 先写一个字符串 在字符串里有0个或多个 每个 要对应后面一个数据或者字符之类的东西 理论上有多少个 都是没问题的 难不成还要搞几亿个printf的重载吗 nonono 这个时候就要用到C 一
  • html实训报告致谢,学术论文致谢词范文

    学术论文致谢篇一 行文至此 不仅意味着我研究生学习阶段的结束 而且也意味着我接受正式教育的结束 此刻我心中百感交集 焦虑 喜悦 失落 激动 时间如白驹过隙 往往在你来不及回味之时 就已经匆匆流逝 开学的那个瞬间仍然历历在目 它仿佛就在昨天
  • 场景间切换与数据传递(以及物体删除技巧)

    先介绍一些基本函数 具体用法自己查文档 1 场景切换 Application LoadLevel Level1 2 读取场景时不移除物体 DontDestroyOnLoad object 会保留该物体的任何数据 包括坐标 可以用于任何物体
  • vue中使用three,绘制3d场景--给模型增加文字标签

    上一篇文章链接 点这里 完整代码点这里 实际需求中 模型总会有一个文字标签 解释模型相关的信息 这里要用到的是 精灵平面 Sprite 精灵平面 Sprite 是一个在3D场景中总是面对着相机的平面 也就是无论你怎么旋转 你会发现他都朝向你
  • Python + Jenkins + Selenium-Grid实现分布式web-ui自动化测试(centos+win10为例)

    简介 Selenium分布式运行 SeleniumGrid 环境配置 jenkins win10 ip 100 100 100 101 selenium hub win10 ip 100 100 100 101 selenium node1
  • R语言—数组

    文章目录 数组 数组的生成 array 使用dim函数生成数组 多维数组的子集操作 数组 向量是1维数组 矩阵是二维数组 数组的维数可以大于2 数组的生成 array 格式 数组名 lt array 数组元素 dim c 第一下标个数 第二
  • 桂林电子科技大学校园网自动登录

    桂电的校园网自动登录十分十分十分简单 1 原理 懒得说原理 2 步骤 网上有 3 结论和方法 1 结论 直接访问特定的url就能登录了 这里给出校园网登录的和联通的url 校园网url http 10 0 1 5 drcom login c
  • 【源码+文档】数据库设计医药销售管理系统之Java

    开发环境和开发工具 操作系统 win8 1 开发环境 Mysql Web 开发工具 Workbench Eclipse JDBC 功能需求分析 员工有权查看 添加会员 查看 添加供应商 查询药品 输入药品编号或名称 类别等查询该药品或该类药
  • 【Spring Boot 源码学习】深入 FilteringSpringBootCondition

    Spring Boot 源码学习系列 深入 FilteringSpringBootCondition 引言 往期内容 主要内容 1 match 方法 2 ClassNameFilter 枚举类 3 filter 方法 总结 引言 前两篇博文
  • UCENTER简单使用 GVINS配置C-RTK9P

    首先去 https www u blox com en product u center 下载ucenter 把C RTK9P通过USB连接到电脑 在Tool gt Receiver Configuration 里面 选好你要更改到RTK里
  • Qt之QGraphicsView实战篇

    前言 前面的章节介绍了 Graphics View 绘图架构 终于到实战了 真的是千呼万唤始出来 这一章节就用 Graphics View 绘图架构来做一个绘图工具 实现一些基础图形的绘制 废话不多说先来看一下结果演示 本文福利 莬费领取Q
  • c语言指针用法及实际应用详解,通俗易懂超详细!

    大家好 我是无际 今天给大家来讲解一下指针 我会由浅到深 最后结合实际应用讲解 让大家学会指针的同时 知道大佬们都用指针来干嘛 长文预警 全文大约5200多字 学指针看这篇文章就够了 很多人跟我刚学习c语言一样 都害怕指针 我也是后面做了一
  • 【2021最新版】Java多线程&并发面试题总结(108道题含答案解析)

    文章目录 JAVA并发知识库 1 Java中实现多线程有几种方法 2 继承Thread类 3 实现Runnable接口 4 ExecutorService Callable Future有返回值线程 5 基于线程池的方式 6 4 种线程池
  • mips-openwrt交叉编译 undefined reference to `__stack_chk_guard 错误

    最近在mips openwrt的工具链中交叉编译可执行程序时 出现了以下的错误 undefined reference to stack chk guard undefined reference to stack chk fail 百度一
  • CUDA编程 之 二进制工具与反编译

    两个 反编译工具 cuobjdump and nvdisasm 参考 http blog csdn net dark5669 article details 62264312
  • python中的copy和deepcopy

    数据处理经常会用到引用或者赋值 Python中的可变类型变量在操作时需要注意拷贝的方式 特别在实现复杂功能的函数时 一不小心就会改变原来的数据内容 data name anne age 18 scores 语文 130 数学 150 英语