昨天改个小功能,把一个列表赋值给新变量,然后在新变量上删了俩元素,想着原列表不动。结果一跑测试全红。
笑死,a = b 根本不是复制,是俩名字指向同一个对象。我删的是俩名字共用的那个,原列表当然一起没。
哈哈
后来才懂要 copy.deepcopy 或者切片 [:] 才真分开。之前一直以为 = 就是复制,绝了,白踩这么多年坑。
你们有没有被浅拷贝背刺过,说说让我平衡一下
昨天改个小功能,把一个列表赋值给新变量,然后在新变量上删了俩元素,想着原列表不动。结果一跑测试全红。
笑死,a = b 根本不是复制,是俩名字指向同一个对象。我删的是俩名字共用的那个,原列表当然一起没。
哈哈
后来才懂要 copy.deepcopy 或者切片 [:] 才真分开。之前一直以为 = 就是复制,绝了,白踩这么多年坑。
你们有没有被浅拷贝背刺过,说说让我平衡一下
这坑太经典了!白踩这么多年真冤,[:] 记牢 deepcopy 就稳
这种一删全没的瞬间真的会让人愣一下,明明觉得自己没碰原来的啊。不过你现在是真把原理想通了,往后切片或者 deepcopy 直接上,这种坑基本就绕开了。我虽不怎么写代码,但生活里也常有"原来一直理解错了"的时候,发现那刻又气又想笑。理解的谢谢楼主分享,被你这么一说我也平衡不少。
a=b那一下太迷惑了 我也被坑过 删完还以为原数据稳着呢 绝了
哈哈我也踩过 当时把配置列表赋值完直接上手改 原数据跟着没了 测全红那会儿真想砸键盘 后来切片[:]直接焊手上 不过切片只管一层 嵌套的还是得deepcopy 别问我怎么知道的
这坑绝了属于是,但说真得 [:] 只是浅拷贝,里头还嵌着可变对象的话,你删的照样是俩名字共用的那个。
a=b 这俩字害人不浅 我上次也栽在这 以为稳了结果一地鸡毛 哈哈哈
我之前也犯过一模一样的错,还纳闷怎么改着改着原数据就乱了。不过悄悄补一句,切片[:]其实也是浅拷贝,你这次删的是顶层元素所以没事,要是列表里还套着列表照样会一起变,那种情况还是得老老实实deepcopy (。•ᴗ•。)
想当年我刚摸这些的时候,也犯过一模一样的错,删完还纳闷测试怎么全红了。
不过借楼主这话多唠一句——deepcopy 真不是万能钥匙。其实它慢是一说,遇上带循环引用的对象还能递归爆给你看。[:] 切片也只是救了外层,里头要是还套着列表,照样浅得很,过两天又得被背刺一回。
所以我后来学乖了:但凡要"独立副本",先停下来想清楚那对象里到底装了啥,别记口诀。很多时候根本用不着复制,换个写法就绕过去了。坦白讲
踩坑不丢人,白踩这么多年才叫绝,哈哈。你们都是怎么查出来的?
笑死 我以前也这么干过 改完一跑原表全空了 人都傻了 这坑真是一踩一个准
笑死,你这帖看得我直拍大腿。"白踩这么多年坑"这句我直接收藏了,太真实。
说真的 a=b 那一下确实阴,俩名字共用一个对象,你以为分家了其实还睡一张炕。不过我寻思你都混到改功能跑测试了,这坑踩得也不算冤,就当程序员的成人礼吧哈哈。
我虽然不写代码,但这种"以为俩其实一"的背刺我也挨过——早年以为照片存手机又存云盘就双份保险,结果同步一删全没,那叫一个透心凉。所以你这心情我懂,坑都一个德行:平时装没事,等你真动手才咬你。
绝了,下次再踩记得喊我,搬板凳看戏( ̄▽ ̄)
[:] 其实也是浅拷贝好嘛,嵌套列表照样一起没。绝了,我也被这么坑过,平衡了没