现有数据:python
data = { "name":"alex", "age":18, "scores":{ "语文":130, "数学":60, "英语":98, } } d2 = data data["age"] = 20 print(d2)
问:上面代码执行后打印的d2里的age是18,仍是20?工具
# 结果 {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
问什么是20呢?由于d2 = data至关于只是拿到了data的内存地址,但data里的每一个key,value都是由单独的内存地址的。d2,data会一直共享这个字典里的数据,不会出现像以前字符串a=1,b=a,a=2,b依然等于1的状况。3d
若是就是想复制一份完整的字典里数据,该怎么办呢?code
能够用浅copy语法:blog
data = { "name":"alex", "age":18, "scores":{ "语文":130, "数学":60, "英语":98, } } d2 = data.copy() data["age"] = 20 print(d2) print(data)
输出结果:内存
# d2 {'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 60, '英语': 98}} # data {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
这样就至关因而2份独立的数据了,可是为何这个语法叫作浅copy呢?你修改一下score里的值就知道了。开发
data = { "name":"alex", "age":18, "scores":{ "语文":130, "数学":60, "英语":98, } } d2 = data.copy() data["age"] = 20 data["scores"]["数学"] = 77 print(d2) print(data)
输出结果:字符串
# d2 {'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 77, '英语': 98}} # data {'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 77, '英语': 98}}
从上面的结果能够知道,两个字典里的值是独立的,可是scores字典里的分数值貌似是共享的。数学
由于浅copy仅会复制字典的第一层数据,更深层的scores字典下面的值依然是共享一份的。class
主要看图中的2个字典的name都是alex,内存地址也同样,在没改以前,两个name都确实指向同一个内存地址,但只要改任何一个值,内存地址都会变动,如age。
若想完全使上面的2个字典,不管有多少层数据,都彻底独立,那就得用到python工具包里得一个工具了。
深浅copy有什么用?坦白讲,之后开发中多数状况下用不到,可是要会这个知识点,说不定哪天有个需求就要求你必须确保你复制出来2个彻底独立的字典或列表。