深淺copy

深淺copy

1、淺copy

現有數據: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、深copy

若想完全使上面的2個字典,不管有多少層數據,都徹底獨立,那就得用到python工具包裏得一個工具了。

深淺copy有什麼用?坦白講,之後開發中多數狀況下用不到,可是要會這個知識點,說不定哪天有個需求就要求你必須確保你複製出來2個徹底獨立的字典或列表。

相關文章
相關標籤/搜索