小白发现一个 dict 的奇怪现象,请问有什么办法可以避免

2021-05-09 21:07:53 +08:00
 meteordragon
dd={"a":"1","b":"2"}
cc=dd
cc["c"]="3"
print(dd)
print(cc)

运行结果是
{'a': '1', 'b': '2', 'c': '3'}
{'a': '1', 'b': '2', 'c': '3'}

改变 cc 的值同时改变 dd 的值
list 变量有同样的问题
但是我他赋值给另一个变量的目的就是不改变它的值啊。请问有什么办法避免这个问题吗?还是说是我的 python 环境有问题呢?
3339 次点击
所在节点    Python
21 条回复
Jakarta
2021-05-09 21:09:16 +08:00
python 深拷贝 浅拷贝
mcoo1997
2021-05-09 21:11:43 +08:00
import copy
copy.deepcopy(cc)
jmc891205
2021-05-09 21:14:04 +08:00
cc = dict(dd)
di94sh
2021-05-09 21:15:59 +08:00
python 基础知识 可变对象与不可变对象
mostkia
2021-05-09 21:18:04 +08:00
一般的赋值操作,只是拷贝了目标对象的一个内存地址的引用,类似安装的程序,你只拷贝了一个快捷方式,程序被删了或改变了,所有的快捷方式都会跟着失效变动,js 语言也有这类问题,尝试用深拷贝。
ch2
2021-05-09 22:06:21 +08:00
c#+js+python 都是这样
xiri
2021-05-09 22:16:50 +08:00
改成 cc=dd.copy() 就行了,这是很基础的问题,深浅拷贝
meteordragon
2021-05-09 22:20:55 +08:00
感谢各位前辈,之前真没注意过这个问题
jotpot
2021-05-09 23:00:22 +08:00
确实是小白。所有的编程语言都有引用和 clone 的问题
nightwitch
2021-05-09 23:02:17 +08:00
引用语义和值语义的差别,不同语言有不同的倾向。
muzuiget
2021-05-10 01:17:36 +08:00
引用问题,建议把基础部分重看一次。
littlewey
2021-05-10 01:48:17 +08:00
看一下
id(cc)
id(dd)
wd
2021-05-10 05:44:01 +08:00
感觉隔一段时间就有人来这里说说这个问题...
HashV2
2021-05-10 09:06:58 +08:00
我一周看到三四次这个问题了,在不同的语言节点。。
no1xsyzy
2021-05-10 09:22:49 +08:00
应该不算深浅拷贝问题,而是拷贝与引用的问题。

但我觉得你的需求更大可能应该写成
cc = {**dd, "c":"3"}
展开式浅拷贝同时进行修改是非常好用的糖

@jotpot 略暴言。C 语言没有引用与 clone 的问题,都是 clone,只不过 clone 的可能是指针(地址)。你若是非要传参传 struct 而不是 struct* 也给你全量拷贝了(通常没人这么用罢了)。Pascal 类似。
函数式语言也不会遇到这个问题,因为全都不可变了,就没引用和 clone 的差异了。
Kilerd
2021-05-10 09:29:13 +08:00
这是 python 有史以来的 bug,建议换一门语言以避免同样的 bug
RRRoger
2021-05-10 09:42:10 +08:00
百度谷歌随便一搜就有解决方案
charlie21
2021-05-10 15:59:46 +08:00
“(用等号)赋值给另一个变量的目的就是不改变它的值”
这个目的没错,但只限于值类型的变量。
参考 v2ex.com/t/774968 24 楼 PHP 语言
ddzzhen
2021-05-10 21:08:17 +08:00
赋值操作是链接,占用内存不增加
xiaoxinshiwo
2021-05-11 16:05:33 +08:00
[捂眼睛]

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/775865

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX