Python 深拷贝 浅拷贝

前几天面试碰到面试官问pythonh深拷贝和浅拷贝的问题,还好当时说了一句,python的我不太清楚,给你讲讲C++吧,blabla。。。

一直都用c++刷题,Python还真不清楚,今天碰到leetcode138正好是深拷贝问题,于是用python写了一下:

import copy
class Solution:
    def copyRandomList(self, head: 'Node') -> 'Node':
        x = copy.deepcopy(head)
        return x

在这里插入图片描述
mmp Python刷题真的简单 啊啊 啊啊啊啊啊啊啊啊啊!

于是打算研究一下python的深拷贝与浅拷贝。。。
以下代码是抄的,连图都是粘贴的
地址
https://www.cnblogs.com/xueli/p/4952063.html

在python中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用

一般有三种方法,

alist=[1,2,3,[“a”,“b”]]

(1)直接赋值,

默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的b也会做相同的改变

>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]

在这里插入图片描述

(2)copy浅拷贝,

没有拷贝子对象,所以原始数据改变,子对象会改变

>>> import copy

>>> c=copy.copy(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]

>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 里面的子对象被改变了

在这里插入图片描述

(3)深拷贝,

包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

>>> import copy

>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始终没有改变
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']]  始终没有改变

在这里插入图片描述

版权声明:本文为xz1308579340原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xz1308579340/article/details/89195654

智能推荐

Jenkins-gitlab

实验环境: ​ Git/Maven :192.168.116.102 ​ Gitlab: 192.168.116.107 ​ Jenkins 192.168.116.103 ​ Nexus 192.168.116.104 实验目的: ​ 在 Maven中生成一个jar 包,将其解压后上传至 gitlab (kgcapp)项目中,然后 Jenkins 将其从 gitlab中拉取至 Jenkins 项...

hive实操二(连续7天登录的总人数)

求连续7天登录的总人数 数据: 所用SQL: 解析: 第一步:先使用窗口函数,根据用户id分组,日期排序 如下图: 第二步:在第一步的基础上,使用date_sub日期函数 ,date_sub(date,dateStr)表示,哪一天减多少天,使用这个函数的作用是计算出每个日期排名前的日期 如下图: 第三步:在第二步的基础上,根据用户id和日期分组,计算日期数目大于7的用户 如下图:...

20道25K+Android工程师面试必问面试题

25K大致算的上是Android开发的一个分水岭了。没点真正的东西,还真的拿不到25 本文讲解: 我们为什么要选择离职 面试必问面试题 如何选择心仪的公司 一.我们为何选择离职 工资跟不上消费 上班找不到归宿感和成绩感,上班感觉和坐牢一样 在公司没有发展空间 二.25K+Android工程师必问面试题 1.APK安装过程 应用安装涉及到如下几个目录: system/app:系统自带的应用程序,无法...

nginx实现反向代理

一.代理概念: 1.什么是正向代理和反向代理,概念我这里就不做解释,因为网上有大神已经解释的很好了,我这里给出链接https://www.cnblogs.com/Anker/p/6056540.html。 二.介绍nginx反向代理环境准备,工具准备: 1.首先你需要安装一个虚拟机VMware,虚拟机中安装一个linux系统,linux系统中需要安装两个tomcat服务器。 2.因为后面需要对反向...

猜你喜欢

第27课 二阶构造模式

本文内容取自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结 构造函数的回顾 关于构造函数 类的 构造函数 用于对象的 初始化 构造函数 与类同名并且没有返回值 构造函数在对象定义时 自动被调用 问题 如判断 构造函数 的执行结果? 在构造函数中执行 return 语句会发生什么? 构造函数执行 结束是否意味着 对象构造成功? 为什么了回答这几个问题,我们编写一个构造函数,并且构造函数中添...

微机原理 第七章 8255A及I/O口

微机原理 第七章 8255A及I/O口 7.1 概述 一、 并行接口 什么叫并行接口? 连接CPU与并行外设的通道 以字节、双字节或字长为传输单位。 为什么要用?或者说,为什么会广泛应用? 传输速度快,但硬件开销大,近距离传输 一般传输什么信息? 传输的信息主要有状态信息、控制信息和数据信息,所以有对应的寄存器 在端口是不够用的时候,得进行扩展 二、可编程并行接口的功能 有什么特点? 具有端口寄存...

C语言非OS编程架构

    对于单片机非OS程序来说,好的架构必须具备如下特点:代码规范优雅,结构清晰,各模块之间低耦合。个人根据多年工作经历,总结如下:编写代码前应进行结构设计,C语言是面向过程的语言,所以一般系统结构分为三层:驱动层,功能模块层,任务调用层。为了降低耦合性,函数调用规则尽可能做到上层调用下层。     驱动层     非OS驱动层一般由硬...

spring boot 源码解析12-servlet容器的建立

前言 spring boot 一般都会加入如下依赖: 加入后,就会启动一个嵌入式容器,其默认启动的是tomcat.那么他是如何启动的,我们接下来就分析下. 解析 通过之前的文章我们知道了在SpringApplication#run方法的第9步会调用AbstractApplicationContext#refresh方法,而在该方法的第5步中会调用invokeBeanFactoryPostProce...

leetcode之除数博弈

原题链接 这道题我看到leetcode上有个巧妙解法,利用N的奇偶性就可以判断先手的输赢; 但是看到这道题目属于动态规划,那么就该朝着动态规划的思路去做,但是我觉得这道题虽然是简单题,但是有点绕。...