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这门贴近人类自然逻辑的语言,它们应当时刻保持地址一致性,对编程人员屏蔽所有破坏地址一致性的操作,强制保持一致。但事实结果已经在上文阐述了。

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

能碳双控| AIRIOT智慧能碳管理解决方案 基于AIRIOT打造的智慧能碳管理平台解决方案结合大数据、物联网、人工智能(AI)、数字孪生等新一代信息技术,通过整合碳达峰、碳中和、实时碳价、碳配额和碳资产等多个模块,为组织提供了全方位、灵活且智能的碳资产管理解决方案,有助于实现碳管理目标、提升可持续性,并适应碳市场的不断变化。 阅读详情

相关推荐

《基于Yolo算法的火灾检测系统设计与实现》开题报告

在消防安全领域,火灾对生命财产安全构成严重威胁。传统的火灾检测手段存在诸多不足,如误报率高、检测范围有限、响应速度慢等。基于 Yolo 算法的火灾检测系统能够利用深度学习技术,实现对火灾的高效、精准检测,具有重要的现实意义。         从社会安全角度看,该系统可以广泛应用于各类公共场所、工业厂房和居民住宅,实时监测火灾隐患,及时发出警报,为人员疏散和消防救援争取宝贵时间,有效降低火灾造成的人员伤亡和财产损失,保障社会公共安全。

m0_69704149的博客 1384

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

大模型选型实战指南|教育行业:108个模型「闭卷考试」实测,这3类应用场景直接抄作业!

教育行业大模型选型必读 1.闭卷考试!独家评测集:用最新K12真题(小学-高中全学科)构建“闭卷考场”,108个模型同台竞技,数据污染率<5%(传统评测集污染率超60%) 2.价格透明对比:40元/M tokens的阿里系模型VS 2元/M tokens的字节系、腾讯系模型,谁更值? 3.四大选型禁区:>60元但得分<75的模型被列入不推荐名单(附避坑清单) 4.核心结论直出:教学核心环节必须用专用模型,90%场景用通用模型可降本50%+

easyllm的博客 1522

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

海康威视 2024届 数字逻辑设计 实习笔试分析

记录一下 5月11日晚,做的海康威视的一场笔试。分享给需要的IC人。 岗位:数字逻辑设计工程师(浙江 杭州) 转载需要本人同意! 我的见解不一定都是准确的,欢迎评论区交流指正~~

记录所学,分享知识,结识挚友 1万+

【ComfyUI 基础教程】ComfyUI 局部重绘工作流教程

本篇指南将带你了解 ComfyUI 中的局部重绘工作流,并带你完成一个局部重绘的示例,以及遮罩编辑器的使用等。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 303

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

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

weixin_44490223的博客 204

运维颠覆!一文解锁AI赋能运维实战秘籍,效率飙升!

将AI应用于运维工作是一场极具价值的变革,从故障预测与诊断到自动化任务执行,再到资源管理优化,AI都展现出巨大潜力。尽管在实践过程中会面临数据质量、模型复杂性等挑战,但通过合理的技术选型和解决方案,我们能够充分挖掘AI的优势,实现运维工作的高效、智能转型。持续探索和创新AI在运维领域的应用,将为企业的数字化发展提供坚实保障。在科技飞速发展的当下,运维领域正经历着深刻变革,AI的融入成为提升运维效率与质量的关键。本文将深入实战,带你领略AI如何在运维各环节大显身手,让你的运维工作开启智能高效新模式。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 401

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

ResNet改进(20):融合Swin Transformer与ResNet

这种混合架构的设计理念是:在保留CNN强大局部特征提取能力的同时,引入Transformer的全局建模优势。我们实现的模型在ResNet18的基础上嵌入了一个简化版的Swin Transformer Block,旨在探索两种范式结合的可能性。通过在ResNet早期阶段引入Transformer模块,我们既保留了CNN强大的局部特征提取能力,又获得了Transformer的全局建模优势。本文提出的ResNet与Swin Transformer混合架构,探索了CNN与Transformer结合的可能性。

2401_82355416的博客 859

时间序列预测 | Python实现LSTM时间序列数据预测

目录LSTM神经网络LSTM原理LSTM数据下载LSTM程序设计导入Python包时序数据处理LSTM模块定义模型训练模型评估参数设定运行结果参考资料致谢 LSTM神经网络 长短期记忆网络——通常简称为“LSTM”——是一种特殊的 RNN,能够学习长期依赖关系。它们由Hochreiter & Schmidhuber (1997)引入,并在后续工作中被许多人提炼和推广。1它们在处理各种各样的问题时效果非常好,现在被广泛使用。LSTM 被明确设计为避免长期依赖问题。长时间记住信息实际上是他们的默认行为

前程算法屋的博客 3911

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

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

weixin_39926739的博客 156

OpenClaw 股票自动化交易实践指南:从原理到实战的完整技术路径

量化交易策略的开发是一个系统工程,需要综合运用金融知识、编程技能和数据分析能力。OpenClaw通过引入提示词工程技术,大大降低了策略开发的技术门槛,使得更多投资者能够参与到量化交易中来。但技术只是工具,真正决定策略成败的是对市场的深刻理解和严格的风险管理。本章系统介绍了OpenClaw环境下的策略开发方法,从提示词驱动到传统代码实现,从参数优化到回测验证,涵盖了策略开发的完整流程。提示词驱动方式适合快速验证交易想法,传统代码方式适合实现复杂的定制逻辑,两种方式可以协同使用,发挥各自的优势。

lovely_yoshino的博客 5990

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

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

龙哥盟 1662

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

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

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

weixin_39876650的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

2501_94305413的博客 928

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、付费专栏及课程。

余额充值