首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python中浅拷贝与深拷贝的骚操作

Python中浅拷贝与深拷贝的骚操作

作者头像
Ai学习的老章
发布于 2020-09-14 07:32:24
发布于 2020-09-14 07:32:24
38600
代码可运行
举报
运行总次数:0
代码可运行

【例子】浅拷贝与深拷贝中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list1 = [123, 456, 789, 213]
list2 = list1
list3 = list1[:]
print(list2)  
# [123, 456, 789, 213]
print(list3)  
# [123, 456, 789, 213]
list1.sort()
print(list2)  
# [123, 213, 456, 789] 
**print(list3)  
# [123, 456, 789, 213]**
list1 = [[123, 456], [789, 213]]
list2 = list1
list3 = list1[:]
print(list2)  
# [[123, 456], [789, 213]]
print(list3)  
# [[123, 456], [789, 213]]
list1[0][0]  = 111
print(list2)  
# [[111, 456], [789, 213]]
**print(list3)  
# [[111, 456], [789, 213]]

小朋友,你是否有很多问号?????

为什么同样是list3 = list1[:] 执行list1.sort() 操作,list3不发生变化 执行list1[0][0] = 111 操作,list3发生变化

首先我们先了解到python的拷贝有浅拷贝和深拷贝之分

序号

操作语句

拷贝类型

1

Y= X

直接赋值(浅拷贝)

2

Z = X [:]

浅拷贝

3

P = copy.copPy(X)

浅拷贝

4

K = copy.deepcopy(X)

深拷贝


接下来我们来探索一下,这些个浅拷贝和深拷贝具体细节上有什么区别呢?

看看这个case

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import copy
X = [1,3,5,['我','是','第','二','维','度'],9,11]
Y= X # 直接赋值(浅拷贝)
Z = X [:] # 浅拷贝 
P = copy.copy(X)  # 浅拷贝 
K = copy.deepcopy(X)# 深拷贝 

#现在我们在X数组的第三个值里面添加一个'哈哈',把里面的是改为不是
X[3].append('哈哈')
X[3][1] = '不是'

#我们打印一下结果瞧一瞧
print("起始列表X为 : ", X)
print("把X列表赋值给Y为 : ", Y)
print("浅拷贝X列表给Z为 : ", Z)
print("浅拷贝X列表给P为 : ", P)
print("深拷贝X列表给K为 : ", K)
输出结果为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
起始列表X为 :  [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]X列表赋值给Y为 :  [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]
浅拷贝X列表给Z为 :  [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]
浅拷贝X列表给P为 :  [1, 3, 5, ['我', '不是', '第', '二', '维', '度', '哈哈'], 9, 11]
深拷贝X列表给K为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]

是不是发现深拷贝与浅拷贝的一点点区别啦 ^ . ^只有深拷贝不被更改**!!!**


辣么,我现在想要把X列表的第三值 ['我','是','第','二','维','度'] 改为 7,把最后一个值改为101,看看这些个浅拷贝和深拷贝又是怎么表现的......

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import copy
X = [1,3,5,['我','是','第','二','维','度'],9,11]
Y= X  # 直接赋值(浅拷贝)
Z = X [:] # 浅拷贝 
P = copy.copy(X) # 浅拷贝 
K = copy.deepcopy(X)# 深拷贝 

现在我们修改X数组的第三个值,把最后一个值改为101

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X[3] = 7
X[-1] = 101

我们打印一下结果瞧一瞧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print("起始列表X为 : ", X)
print("把X列表赋值给Y为 : ", Y)
print("浅拷贝X列表给Z为 : ", Z)
print("浅拷贝X列表给P为 : ", P)
print("深拷贝X列表给K为 : ", K)
输出结果为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
起始列表X为 :  [1, 3, 5, 7, 9, 101]X列表赋值给Y为 :  [1, 3, 5, 7, 9, 101]  
浅拷贝X列表给Z为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]  
浅拷贝X列表给P为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]  
深拷贝X列表给K为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]  

咦!?发现了什么 ~. ~有的浅拷贝背叛了同胞 ! 和深拷贝的表现是一样的


结合上面的例子,我们发现,对二维列表中的第一维数据做修改时,使用 = 进行赋值,对X的修改会影响Y,使用 [:] , copy.copy() , copy.deepcopy() 进行赋值,对X的修改不会影响新的赋值。

如果是对二维列表中的第一维数据做增加或者删除操作呢?试一试咯

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import copy
X = [1,3,5,['我','是','第','二','维','度'],9,11]
Y= X  # 直接赋值(浅拷贝)
Z = X [:]# 浅拷贝 
P = copy.copy(X) # 浅拷贝 
K = copy.deepcopy(X)# 深拷贝 

#在X数组最后添加13,删除第0个值
X.append(13)
X.remove(1)

#我们打印一下结果瞧一瞧
print("起始列表X为 : ", X)
print("把X列表赋值给Y为 : ", Y)
print("浅拷贝X列表给Z为 : ", Z)
print("浅拷贝X列表给P为 : ", P)
print("深拷贝X列表给K为 : ", K)
输出结果为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
起始列表X为 :  [3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11, 13]X列表赋值给Y为 :  [3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11, 13]  
浅拷贝X列表给Z为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]  
浅拷贝X列表给P为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]  
深拷贝X列表给K为 :  [1, 3, 5, ['我', '是', '第', '二', '维', '度'], 9, 11]

我们发现,对二维列表中的第一维数据做增加或者删除操作 同样是只有使用 = 进行赋值,对X的修改会影响Y 于是乎,我们可以把上面的 修改 扩充为 增删改 (改也就包括了排序sort()操作哟) 即对二维列表中的第一维数据做 增删改 操作时,blabla......

你以为这就结束了吗?

我,第二维数据不想被修改,也不想用深拷贝,怎么办? 别急,append和 [:] 组合服用就能够达到深拷贝deepcopy的效果啦 ===>看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
X = [['我','几','维','度'],['我','是','第','二','维','度'],['我','不','说']]
Y= X  # 直接赋值(浅拷贝)
Z = X [:] # 浅拷贝 
P = copy.copy(X)  # 浅拷贝 
K = copy.deepcopy(X)  # 深拷贝 
TT = []
for i in X:
    TT.append(i[:]) # 我是骚操作

#修改第二维度信息
X[1].append('哈哈')
X[1][1] = '不是'

#我们打印一下结果瞧一瞧
print("起始列表X为 : ", X)
print("把X列表赋值给Y为 : ", Y)
print("浅拷贝X列表给Z为 : ", Z)
print("浅拷贝X列表给P为 : ", P)
print("深拷贝X列表给K为 : ", K)
print("骚操作X列表给TT为 : ", TT)
输出结果为:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
起始列表X为 :  [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]X列表赋值给Y为 :  [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]
浅拷贝X列表给Z为 :  [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]
浅拷贝X列表给P为 :  [['我', '几', '维', '度'], ['我', '不是', '第', '二', '维', '度', '哈哈'], ['我', '不', '说']]
深拷贝X列表给K为 :  **[['我', '几', '维', '度'], ['我', '是', '第', '二', '维', '度'], ['我', '不', '说']]
骚操作X列表给TT为 :  **[['我', '几', '维', '度'], ['我', '是', '第', '二', '维', '度'], ['我', '不', '说']]
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Qt开源网络库[5]-lambda支持
在不断使用该库的过程中会遇到这样的一个问题,比如错误提示我只需要打印到终端就可以了,每一次的请求都需要定义一个槽函数然后等待异步调用.在这个过程中,需要定义一个槽函数就会略显得有些繁琐了.
Qt君
2019/07/15
1K0
Qt开源网络库[2]-接口篇
上一篇介绍了Qt开源网络库,有兴趣的可以翻开往期推送.今篇主要介绍该开源网络库接口的用法.
Qt君
2019/07/15
1.8K0
Qt开源网络库[9]-下载文件
有用户反馈说下载文件操作太麻烦了,想了想把这个功能加上吧。只需要简单地调用download()即可轻松下载文件。 接口: 设置下载操作。 /* 保存为默认的文件名,会从请求头去拿文件名字,如果请求头没有则为链接最后的文本内容。*/ HttpRequest &download(); /* 指定保存的文件名字,可包含路径。*/ HttpRequest &download(const QString &file); 响应回调/信号槽。 HttpRequest &onDownloadSuccess(const
Qt君
2023/03/17
9250
Qt开源网络库[9]-下载文件
Qt开源网络库[12]-身份验证
  当带有身份验证的请求时,我们需要填写用户名和密码等信息,但QNetworkAccessManager操作略显繁琐,所以特意封装了一下,简化用户操作。并在此基础上添加自动填写用户信息,验证次数限制和错误处理等功能。
Qt君
2023/03/17
1.1K0
Qt开源网络库[12]-身份验证
Qt开源网络库[7]-阻塞功能
有时候使用多个有顺序Http请求时(下一个请求需要上一个请求的内容),这时候阻塞功能非常有用。 接口 阻塞当前线程,并进入事件循环。 HttpRequest &block(); 实现 使用QEventLoop实现。 QEventLoop loop; QObject::connect(m_networkReply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); /* 阻塞当前线程,如在主线程不会冻结界面。*/ 示例 static HttpServ
Qt君
2019/11/06
1K0
Qt开源网络库[4]-原理篇下
上一篇分析到原理上,主要讲述的是builder模式设计与HttpService,HttpRequest的原理和实现。本篇将会讲到HttpResponse的响应机制与自动推导接收者(槽函数)的实现。
Qt君
2019/07/15
9950
Qt开源网络库[13]-断点续传下载
  默认开启断点续传下载功能,即当程序异常退出时,再次运行会接着从已下载的位置下载。   需要注意的是:如果服务器不支持断点续传功能,则每次下载都是从头开始下载。
Qt君
2023/03/17
5650
Qt开源网络库[13]-断点续传下载
Qt开源网络库[9]-失败重试与重复请求
实际项目使用中,出于对Http请求的容错性,多数都会采用请求失败后重试的策略。除新增了失败重试的功能外还提供重复请求的功能。 失败重试 接口:   设置失败请求后的重试次数,默认值为0。 HttpRequest &retry(int count);   重试次数执行完成后的信号槽/回调。 HttpRequest &onRetried(const QObject *receiver, const char *method); HttpRequest &onRetried(std::function<void
Qt君
2023/03/17
7890
Qt开源网络库[9]-失败重试与重复请求
Qt开源网络库[6]-超时功能
距离上一系列篇已经有半年没有更新了。本次介绍该网络库最近新增的超时功能(超时中断请求)。由于Qt的网络请求不能设置超时时间,故只能额外封装了。 接口 timeout通过msec参数设置超时时间; 当 msec<=0则禁用超时功能; 当 msec>0则使能超时功能,并将超时时间设置为 msec毫秒。 /** * @brief msec <= 0, disable timeout * msec > 0, enable timeout */ HttpRequest &timeout(cons
Qt君
2019/07/15
1.6K0
C++ Qt开发:QNetworkAccessManager网络接口组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QNetworkAccessManager组件实现Web网页访问。
王瑞MVP
2024/03/12
8150
C++ Qt开发:QNetworkAccessManager网络接口组件
Qt开源网络库[3]-原理篇上
上一篇介绍到接口的使用,本篇主要讲述的是该网络库的HttpService与HttpRequest原理与实现。对QNetworkAccessManager封装和管理Http请求。采用builder设计模式,这样在多参数情况下可以灵活运用。
Qt君
2019/07/15
1.4K0
QT应用编程: 基于UDP协议设计的大文件传输软件
功能介绍: 软件由客户端和服务器组成,客户端通过 UDP协议不断循环地向服务端发送文件,文件传输速率可以达到10MB/s以上,文件传输后支持自动删除,客户端上可以支持每分钟创建一个文件并以时间戳命名,每个生成的文件可以设置大小,默认大小为6GB; 服务端收到文件之后,将文件进行存储到本地,可以指定时间自动删除文件; 服务端可以动态计算传输速率,并写入日志文件; 服务器可以支持同时接收多个客户端的文件上传。
DS小龙哥
2022/01/07
3K0
QT应用编程: 基于UDP协议设计的大文件传输软件
Qt学习笔记网络(一)
Qt5 移除了QHttp是因为功能重复 用QNetworkAccessManager完全能搞定 新建一个控制台应用程序 看一下QNetworkAccessManager的帮助文档 需要添加Qt + =
lpxxn
2018/01/31
1.1K0
Qt学习笔记网络(一)
100行代码开源翻译小工具
  100行代码实现翻译小工具,支持中英互译。程序执行文件就不发布了,有兴趣可以下载源码自己编译运行。
Qt君
2023/11/26
4610
100行代码开源翻译小工具
QT软件开发:基于QtAV设计的视频播放器
完整源码下载: https://download.csdn.net/download/xiaolong1126626497/19759245
DS小龙哥
2022/01/12
1.8K0
QT软件开发:基于QtAV设计的视频播放器
QT应用编程:基于QMediaPlayer开发音视频播放器
QMediaPlayer是Qt提供的一个跨平台媒体播放器类,它没有自带解码库,而是对平台相关的播放器框架做了封装,提供了平台无关的API。所以使用QMediaPlayer播放视频,需要提前安装解码库。 在win系统下可以下载K-Lite_Codec_Pack或者LAVFilters解码库安装。
DS小龙哥
2022/01/07
3.7K0
QT应用编程:基于QMediaPlayer开发音视频播放器
基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放
如果有一天,这个代码不能用了,要注意查询的值对不对,酷狗可能是为了防止被爬,data,info,等等这些值有可能被更换成别的,要观察json。
花狗Fdog
2020/10/28
3.3K0
基于Qt的网络音乐播放器(四)酷狗API接口获取歌曲的搜索列表和歌曲的播放
Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON
本文转载自豆子的Qt 学习之路2的博客Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON
ccf19881030
2021/04/19
5.3K0
Qt 学习之路 2(64):使用 QJsonDocument 处理 JSON
Qt 教程二
因为Qt是一个C++框架, 因此C++中所有的语法和数据类型在Qt中都是被支持的, 但是Qt中也定义了一些属于自己的数据类型, 下边给大家介绍一下这些基础的数类型。
用户11332765
2024/10/28
7980
基于Qt的UDP通信、TCP文件传输程序的设计与实现——QQ聊天群聊
QQ是一款优秀的聊天软件,本文将提供主要代码和思路来实现一个类似于QQ群聊的网络聊天软件,大致有以下俩个功能:
秋名山码神
2023/11/23
1.1K0
基于Qt的UDP通信、TCP文件传输程序的设计与实现——QQ聊天群聊
推荐阅读
相关推荐
Qt开源网络库[5]-lambda支持
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档