-
我把一个嵌套的字典拷贝了一份、想改副本而不动原件,结果一改副本里层的数据、原件竟然也跟着变了,排查半天才发现我用的拷贝只复制了最外层、里面那层还是和原件共享的同一个对象的深度复盘
我有个嵌套的数据结构(字典里的值又是列表/字典),要在不影响原件的前提下拷一份出来改改。我很自然用 copy()(或切片 [:]、dict(原件))拷了一份,心想这下副本和原件就是两份独立数据了,随便改副本原件纹丝不动。可改着改着诡异的事发生了:我明明只改了副本里嵌套那层的数据,一回头原件里对应那层也跟着变了。我盯着代码反复看,怀疑哪里引用串了、别处偷偷改了原件,查半天没头绪。直到深究 copy(…- 3
- 0
-
我用乘法快速初始化了一个二维列表,给其中一个格子赋值,结果发现每一行的那个格子都跟着变了:一次 Python 列表乘法复制的是引用而非副本的深度复盘
我要初始化一个 3×3 的二维列表,图省事用了乘法 grid = [[0]*3]*3,打印出来 [[0,0,0],[0,0,0],[0,0,0]] 看着完全正确。可当我 grid[0][0]=1 时,grid 变成了 [[1,0,0],[1,0,0],[1,0,0]]——明明只改了第 0 行第 0 列,每一行的第 0 列都变成了 1。打印 id 才看明白:列表的 *3 复制的是引用而不是副本,它把…- 0
- 0
-
我用 JSON.parse(JSON.stringify()) 深拷贝了一个带 Date 的对象,拷贝完调 date.getTime() 直接报错,因为那个 Date 早被悄悄变成了字符串:一次 JS 深拷贝丢失类型、误用流行偏方的深度复盘
我要深拷贝一个配置对象(里面有 createdAt 是 Date、还有些可选字段),用了那个人人都在用、看起来万能的技巧 JSON.parse(JSON.stringify(obj))。一开始好好的,直到某段代码对拷贝出来的对象调 copy.createdAt.getTime()——砰,TypeError: getTime is not a function。打印对比才看明白:这个深拷贝的原理是先…- 0
- 0
-
一段用浅拷贝复制配置模板的 Python 代码,我改了副本里的一个嵌套列表,结果把原始模板和其他所有副本一起改了:一次浅拷贝陷阱的深度复盘
基于一个嵌套配置模板生成多份各自独立的配置,用 copy.copy 复制后改一份,结果原模板和其他所有副本里的那个嵌套列表全跟着变了。根因是 copy.copy/dict.copy/list[:] 都是浅拷贝:只复制最外层容器,里面嵌套的 list/dict 复制的只是引用、和原来共享同一个对象,改副本的嵌套对象其实改的是大家共享的那一个。本文讲透浅拷贝与深拷贝、Python 变量是引用的本质,给…- 3
- 0
-
我复制了一个对象去改副本,结果原对象也跟着被改了、数据莫名其妙被污染,我对着 JavaScript 的浅拷贝和引用共享排查了大半天的复盘
写表单逻辑,有份原始数据,想在不动原数据的前提下复制一份在副本上改(做编辑预览),用了看起来很标准的展开运算符复制。结果诡异:明明只改了副本,原始数据竟然也跟着变了,页面上原始和修改后显示成一样的、数据被污染。盯着代码反复看,都已经 {...原对象} 复制一份了改副本怎么会影响原对象?排查大半天才理解 JS 两个核心概念——引用类型和浅拷贝:JS 对象/数组是引用类型,变量存的是指向对象的引用;{…- 0
- 0
-
我在 Python 里拷贝了一个嵌套列表,以为是独立副本,结果改副本的内层元素原列表也跟着变了,我对着浅拷贝只复制一层排查了大半天的复盘
我有个嵌套列表(列表套列表),想要份独立副本来改、不影响原始数据,顺手用了切片 original[:](也试过 list()、copy.copy)。可一改副本的内层元素,原始列表的内层也跟着变了——副本好像只独立了一半。深挖才懂是浅拷贝只复制了最外层:original[:] 创建了一个新的外层列表,但里面装的每个内层元素仍然是和原列表共享的同一个对象引用,copy[0] is original[0…- 0
- 0
-
原型模式完全指南:从浅克隆到深拷贝再到不可变共享
原型模式(Prototype)是 GoF 23 个模式里最容易被误解的一个 —— 听起来玄,实际上做的事就是"克隆"。但要把克隆做对、做安全、做高效,牵扯到深浅拷贝、序列化陷阱、循环引用、不可变共享一连串细节。这篇文章从最朴素的需求讲到 JS 原型链、Spring Prototype Scope,让你看到这个模式如何在不同语言里以不同样貌出现。 原型模式要解决什么问题 正常创建…- 0
- 0
深拷贝
幸运之星正在降临...
点击领取今天的签到奖励!
恭喜!您今天获得了{{mission.data.mission.credit}}积分
我的优惠劵
-
¥优惠劵使用时效:无法使用使用时效:
之前
使用时效:永久有效优惠劵ID:×
没有优惠劵可用!







