現有數據: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個徹底獨立的字典或列表。