Python 浅复制的特性还是缺陷?

Check Point防火墙配置实战:从SmartConsole到策略安装排错 防火墙是网络安全的第一道防线,其核心在于访问控制与流量过滤。不同于常见的一体化设备,Check Point将配置管理与流量转发分离,由管理服务器统一维护对象库和策略,安全网关专注执行,而SmartConsole则是工程师的操作入口。这种架构带来集中管理优势,也要求配置流程遵循特定顺序。在实际部署中,从建立管理连接、定义主机与网络对象,到编写访问控制规则与地址转换,再到安装策略并处理失败日志,每一步都至关重要。针对大规模变更,还能借助mgmt_cli脚本批量下发配置,并通过备份与验证确保可回滚。本文以生产环境 阅读详情

概述

我们首先来看官方对列表/字典中copy方法的描述:

>>> help(dict.copy)
Help on method_descriptor:

copy(...)
    D.copy() -> a shallow copy of D

>>>
>>> help(list.copy)
Help on method_descriptor:

copy(...)
    L.copy() -> list -- a shallow copy of L

可以看到,官方对它们的描述都是对原有对象的浅复制(在上一篇文章中 Python——copy/deepcopy中我已说明了copy库中浅/深复制的概念,这里的浅复制概念同copy.copy,不再赘述)。

那么,我们创建一个dict_instance对象,再用copy_instance来接受对dict_instance浅复制的返回结果:

>>> dict_instance = {0: [0], 1: [0, 1], 2: [0, 1, 2]}
>>> copy_instance = dict_instance.copy()
>>> dict_instance[0][0] = 1
>>> dict_instance
{0: [1], 1: [0, 1], 2: [0, 1, 2]}
>>> copy_instance
{0: [1], 1: [0, 1], 2: [0, 1, 2]}

上述,我们修改了字典对象的“0”键所指代的列表值的第一个元素为1,即dict_instance[0][0] = 1,显然copy_instance跟随了这样的修改。可以自行使用id函数看到,确实copy实现了这样的浅复制。

缺陷还是特性?

到目前为止,copy都是正常工作,也符合我们的预期。从一开始,我便希望浅复制时刻保持地址的一致性,但python的浅复制(不论是copy.copy、list.copy还是dict.copy)是否能够时刻保持地址的一致性呢?

我们知道,在Python中,元组、int型、字符串等类型都是不可变类型,在上一篇文章中提到了我们在容器对象中对不可变类型的”修改“实际上是将它指向新的对象/地址,并不是原地修改。

我从逻辑上希望浅复制时刻保持地址的一致性,忽略因”修改“不可变元素而破坏了一致性。但事实上:

>>> from copy import copy
>>> list_instance = [1, 2, 3]
>>> copy_instance = copy(list_instance)
>>> [id(x) for x in list_instance]
[1386622096, 1386622112, 1386622128]
>>> [id(x) for x in copy_instance]
[1386622096, 1386622112, 1386622128]
>>> list_instance[0] = 4
>>> list_instance
[4, 2, 3]
>>> copy_instance
[1, 2, 3]
>>> [id(x) for x in list_instance]
[1386622144, 1386622112, 1386622128]
>>> [id(x) for x in copy_instance]
[1386622096, 1386622112, 1386622128]

从上述代码可明显地观察到copy.copy方法并没有时刻保持地址的一致性,当我们”修改“不可变元素时就破坏了这一致性。同理我们观察list.copy和dict.copy:

>>> list_copy = list_instance.copy()
>>> list_instance
[4, 2, 3]
>>> list_copy
[4, 2, 3]
>>> [id(x) for x in list_instance]
[1386622144, 1386622112, 1386622128]
>>> [id(x) for x in list_copy]
[1386622144, 1386622112, 1386622128]
>>> list_instance[0] = 0
>>> list_instance
[0, 2, 3]
>>> list_copy
[4, 2, 3]

>>> dict_instance = {0: 0, 1: 1, 2: 2}
>>> dict_copy = dict_instance.copy()
>>> [id(x) for x in dict_instance]
[1386622080, 1386622096, 1386622112]
>>> [id(x) for x in dict_copy]
[1386622080, 1386622096, 1386622112]
>>> dict_instance[0] = 3
>>> dict_copy
{0: 0, 1: 1, 2: 2}

可以明显地观察到,列表和字典自带的copy方法与copy.copy表现地一致,均没有在”修改“不可变元素后继续保持一致。

这与我的预期相悖:从我的逻辑上来说,既然是浅复制,且是Python这门贴近人类自然逻辑的语言,它们应当时刻保持地址一致性,对编程人员屏蔽所有破坏地址一致性的操作,强制保持一致。但事实结果已经在上文阐述了。

我无法说清这是否是这门语言的特性,但这确确实实会造成对代码理解的二义性,事实上我和我的朋友就在前几日编程时便错误解读了浅复制的这种特性,甚至因这种特性混淆了深浅复制的概念,于是我认为它应该是一种逻辑缺陷,但如果要弥补缺陷,又会造成新的问题诸如兼容性,为考虑这种情形需要添加的分支判断,修改原有运行机制等,这是一个值得思考的问题。

远红外热传感器阵列 (32x24 RES) MLX90640ESF-BAA/BAB Melexis MLX90640是一款小体积、低成本的完全校准的32x24像素红外阵列,采用行业标准,带数字接口。3.其工作温度范围为 -40°C 至 85°C,可测量的物体温度范围为 -40°C 至 300°C。该红外传感器在整个测量范围内保持高精度水平,可提供 ±1°C 的典型目标物体温度精度。2.这款 32x24 像素的器件适用于安全和便利应用,包括防火系统、智能楼宇、智能照明、IP/监控摄像机、HVAC 设备和车辆座椅占用检测。1.工作温度范围为 -40 至 85°C,可在严苛的工业环境中部署。 阅读详情

相关推荐

S型速度曲线C程序实现

S型速度曲线C语言程序实现 前言 S型曲线相较于梯形速度曲线具有运行更加平稳的特点,S型曲线共有八种运行情况,感兴趣可以查阅相关文献 代码段 #include <stdio.h> #include <math.h> #define FP64 double int main(void) { /**************************** 定义相关变量(需要映射到PLC寄存器才能进行监控) ***********************/ FP6

LSX312441548的博客 8392

dict中所有方法的使用

dict中所有方法的使用 样例: 2、copy 样例: 3、fromkeys 样例: 4、get 样例: 5、items 样例: 6、keys 样例: 7、pop 样例: 8、popitem 9、setdefault 10、update 样例: 11、values 样例:

m0_63615831的博客 202

ArcGIS License Server点击启动没反应,许可管理器无法启动怎么办

4 当我们再打开ArcGIS License Server Administrator的时候。3 在【服务】中找到【ArcGIS License Manager】双击。无法启动ArcGIS License Server的情况。在使用ArcGIS的过程中,我们经常会遇到。专注GIS领域知识分享,交流行业软件技巧。欢迎关注,不定期分享GIS各种问题和技巧。1 右击我的电脑——【管理】服务状态——启动,确定即可。启动类型选择——自动。

GIS蒲公英的博客 2万+

Pyhon的第四天

(1)clear(...)删除所有元素D.clear() -> None.从 D 中删除所有项目。(2)copy(...) 拷贝D.copy() -> a shallow copy of D D.copy() -> D 的浅层副本(3)fromkeys(*args, **kwargs)Create a new dictionary with keys from iterable and values set to value 创建一个新字典,其中包含可迭代的键并将值设置为值 (4)items(...)D.i

cxy003344的博客 164

PCL点云处理之计算点到空间直线距离的四种方法(二十三)

PCL点云处理之计算点到空间直线距离的四种方法

weixin_44329757的博客 3022

fanuc机器人KAREL中 函数的应用

本次课程讲解编程的思路。很多的同学都玩过积木,一个一个的模块逐渐累积起来,通过彼此之间的相互联系,最终形成一个完整的整体。其实编程也是这样。 将一个对象根据其特点进行模块化拆分,尤其是一些特点非常相似的内容,将其变成一个模块。然后通过传递参数,实现不同的功能,这就是模块化编程。

haier123888的博客 2744

Python入门:数据结构之字典(dict)(完结篇)

今天时间有限,虽然会把字典剩下的几个操作方法讲完,但是没有西游记的内容了,毕竟大战狮驼岭可是西游记中相当经典的部分。 'copy', 'fromkeys', 'get', 'setdefault', 'update' copy:copy(...) D.copy() -> a shallow copy of D copy在Python中用的很多。 程式中的拷贝分为深拷贝和浅拷贝,一般copy是指浅拷贝。 深拷贝

weixin_44490223的博客 204

华为OD新系统机试真题-勇攀数字高峰(Java/Py/C/C++/Js/Go)

新系统 华为OD机试新系统【勇登数字高峰】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统机试真题【勇登数字高峰】

qq_45776114的博客 1545

Python学习笔记 —— 字典

字典 基本格式 #Python info = {'age':30,'height':200,'Lover':'Marry','Intersting':'Football'} print(info['age']) print(info['Lover']) 字典是一系列 ”键-值“,类似于 对象 - 属性 添加键-值对 info['car'] = 'Geely' info['Color'] = 'Green' print(info) 修改字典 # 定义空字典,并增加键值对 Per_Info = {} Per

kaijian1226的博客 946

通信算法之325:无人机云哨协议及发射机接收机仿真算法

【代码】通信算法之325:无人机云哨物理层协议及发射机接收机仿真代码。

leegang12的专栏 362

滑模控制算法(SMC)讲解-案例(附C代码)

该文章介绍了滑模控制算法的原理实现步骤,特点及关键问题,最后以车辆控制案例来讲解滑模控制的整个步骤实现

heda3的博客 4111

diveintopython3 official_【python3】关于列表的copy方法的一个官方bug

该楼层疑似违规已被系统折叠隐藏此楼查看此楼不认同你的说法,出现这种原因在于python将int型视为不可变类型。使用help函数可以看到,官方对字典和列表的copy方法均描述为浅复制,浅复制原理是复制了对象的地址(使用id函数可以观察)。>>> help(dict.copy)Help on method_descriptor:copy(...)D.copy() -> a ...

weixin_39926739的博客 156

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 266

Python 进阶指南(编程轻松进阶):六、编写 Python 风格的代码

所有编程语言都有自己的习惯用法和最佳实践。本章重点介绍 Python 程序员编写“Python”代码的特殊方式,以充分利用 Python 的语法。Python 代码的核心是来自 Python 禅宗的 20 条格言,它们是编写 Python 的粗略指南。这些格言只是观点,对于编写 Python 代码来说并不是绝对必要的,但是记住它们是有好处的。Python 的显著缩进(不要与显著的空白混淆)引起了刚入坑 Python 程序员的最大抗议。

龙哥盟 1662

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

python初学者代码示例_python入门(非常详细的教程)

对于初学者而言,您要做的只是专注于Python语言,阐明学习重点,掌握学习节奏,并逐步学习。根据我多年的学习和工作经验,编程语言的学习分为以下三个步骤,无论您是否具有编程基础,都可以通过比较来完成。1)多练习多积累代码任何编程语言都具有广泛的知识,从基本变量赋值,条件循环到文件操作,并发编程等。但是,不要等到学习了所有知识点后再开始练习,因为到那时会发现您已经忘记了难以记住的知识。学习编程非常实用...

weixin_39876650的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python 入门避坑指南:新手必学的核心语法

Python 入门的“坑”,本质上都是对“语法规则”和“语言特性”理解不透彻的结果。避开这些陷阱,核心在于建立“严谨的编程思维”,而非死记硬背规则。

2501_94305413的博客 928

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

scrapling 官网教程

选择使用方法查找元素访问元素的数据Navigation 导航抓取网站内容HTTP 请求动态加载的网站动态加载,并且有防护的网站。

freeking101的博客 1112

Python-copy()与deepcopy()区别

最近在实习,boss给布置了一个python的小任务,学习过程中发现copy()和deepcopy()这对好基友实在是有点过分,一开始还相爱着呢,不知道怎么回事就开始相杀了。 搞的博主就有点傻傻分不清啊,但是呢,本着一探到底的极客精神,还是要查资料搞清楚这对好基友的区别。 其实呢,copy()与deepcopy()之间的区分必须要涉及到python对于数据的存储方式。 首先直接上结论:

枕2畔雪的博客 17万+

Shallow copy and Deep copy

Shallow copy and Deep copy 第一部分: 一、来自wikipidia的解释: Shallow copy One method of copying an object is the shallow copy. In that case a new object B is created, and the fields values of A are copied o...

weixin_34345560的博客 195

由Python的浅拷贝(shallow copy)和深拷贝(deep copy)引发的思考

首先查看拷贝模块(copy)发现: >>> help(copy)Help on module copy:NAME copy - Generic (shallow and deep) copying operations.DESCRIPTION Interface summary: import copy x...

weixin_30879833的博客 177

深浅有度,才能游刃有余,Python的copy函数实战解析

深度copy和浅度copy回顾 我们有一个对象Coder(编程者),它包含昵称,编程年数,以及所会的编程语言列表: class Coder: def __init__(self, nickname, experience_years, skills): self.nickname = nickname self.experience_years = experience_years self.skills = skills 其中skills是一个列表,里面包含至少一种编程语言。 我们创建

JAVAmonster12的博客 569

Python 深拷贝效率问题与改进

        我们都知道Python里有个copy包,这个包提供浅拷贝(copy)和深拷贝(deepcopy)两个拷贝对象的方式。浅拷贝是在另一块地址中创建一个新的对象,但是新对象的子引用还是会指向源对象的子对象,即拷贝的时候只会第一层引用,对于后几层的引用还是指向源地址的。如果这时候我们修改源对象的子对象的属性, 新对象中子对象的属性也会改变。深拷贝是在另一块地址中创建一个新的对象,同时对象内...

基咯咯 5468

程序员必知的 Python 陷阱与缺陷列表

我个人对陷阱的定义是这样的:代码看起来可以工作,但不是以你“想当然“”的方式。如果一段代码直接出错,抛出了异常,我不认为这是陷阱。比如,Python程序员应该都遇到过的“UnboundLocalError”, 示例: Python 12345678910111213141516171819>

尚是-Swim 637

浅拷贝问题出现原因剖析

#include using namespace std; class Test { public: Test(const char*p) { this->len = strlen(p); name = (char*)malloc((len+1)*sizeof(char)); strcpy(name,p); } Test(const Test &obj)//解决浅拷贝问题

bbs375的博客 983

解析浅拷贝的缺陷及其解决方案

浅拷贝的缺陷 类的定义: class Name { public: Name(const char *myp) { m_len = strlen(myp); m_p =(char *) malloc(m_len + 1); // strcpy(m_p, myp); } ~Name() { if (...

Hello,小高同学 1915

《五分钟速学技巧_利用ip代理绕过ip访问限制防爬策略》

批量获取代理IP详见上篇文章《分享项目_python爬取可用代理ip》,在大量爬取某个指定网站时,若该网站做了限制单位时间内同个ip的访问次数,则需要利用代理ip来帮助我们的爬虫项目完成请求。获取免费的代理IP很简单,百度免费代理IP即可,本文中在点击打开链接获取代理IP

Christopher_L1n的博客 6829
上一篇: Python——copy/deepcopy
下一篇: Hadoop伪分布部署
L4mbert
博客等级 码龄10年 120粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值