python字典copy()方法

Posted 安迪_963

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python字典copy()方法相关的知识,希望对你有一定的参考价值。

python 字典的copy()方法表面看就是深copy啊,明显独立

技术分享
1 d = {a:1, b:2}
2 c = d.copy()
3 print(d=%s  c=%s % (d, c))
Code1

结果:

d={‘a‘: 1, ‘b‘: 2}  c={‘a‘: 1, ‘b‘: 2}

修改d,看看c变化没有。

技术分享
1 d[a]=3
2 print(d=%s  c=%s % (d, c))
Code2

结果:

d={‘a‘: 3, ‘b‘: 2}  c={‘a‘: 3, ‘b‘: 2}

这里仍然是相同的

再改:

技术分享
1 d = {b: 2, a: 3, c: [a, c]}
2 b = d.copy()
3 print(d=%s  b=%s % (d, b))
Code3
技术分享
1 d[c] = [a,c, shallow]
2 print(d=%s  b=%s % (d, b))
Code4

code4 中重新对d[‘c‘]赋值了,发现结果是不相同的

d={‘a‘: 3, ‘c‘: [‘a‘, ‘c‘, ‘shallow‘], ‘b‘: 2} b={‘a‘: 3, ‘c‘: [‘a‘, ‘c‘], ‘b‘: 2}

但是,这里的修改是重新赋值,如果直接对其进行修改呢?

技术分享
1 d = {b: 2, a: 3, c: [a, c]}
2 b = d.copy()
3 
4 d[c].append(123)
5 print(d=%s  b=%s % (d, b))
Code5

结果:

d={‘b‘: 2, ‘c‘: [‘a‘, ‘c‘, 123], ‘a‘: 3} b={‘b‘: 2, ‘c‘: [‘a‘, ‘c‘, 123], ‘a‘: 3}

发现两者并不是完全独立的,这就是“浅拷贝”的由来。

 

那么,问题来了:为什么对d重新赋值时c没有改变,而对d直接修改时c又改变了呢?

说到底还是python的机制问题,因为赋值操作都是在引用。

技术分享

开始d,c引用同一个字典,当对d重新赋值后,c还指向原来的字典,但d引用已经改变,所以两都独立。

但是,当我在原字典的基础上直接修改c的value值(一个列表)。

技术分享

此时d,c仍然那个字典,所以两者都改变了。

以上是关于python字典copy()方法的主要内容,如果未能解决你的问题,请参考以下文章

python3中字典的copy

python中字典dict的中的copy和deepcopy

13 个非常有用的 Python 代码片段

Python代码阅读(第19篇):合并多个字典

Python snippet(代码片段)

Python代码阅读(第26篇):将列表映射成字典