python中的賦值與深淺拷貝
阿新 • • 發佈:2018-11-28
from copy import copy, deepcopy a = [1, 2, 3, 4, ['a', 'b']] # a = [1, 2, 3, 4, ['a', 'b']] b = a # b = [1, 2, 3, 4, ['a', 'b']] c = copy(a) # c = [1, 2, 3, 4, ['a', 'b']] d = deepcopy(a) # d = [1, 2, 3, 4, ['a', 'b']] a.append(5) # a = [1, 2, 3, 4, ['a', 'b'], 5] # b = [1, 2, 3, 4, ['a', 'b'], 5] # c = [1, 2, 3, 4, ['a', 'b']] # d = [1, 2, 3, 4, ['a', 'b']] a[4].append('c') # a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] # b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] # c = [1, 2, 3, 4, ['a', 'b', 'c']] # d = [1, 2, 3, 4, ['a', 'b']] d[4].append('x') # a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] # b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] # c = [1, 2, 3, 4, ['a', 'b', 'c']] # d = [1, 2, 3, 4, ['a', 'b', 'x']]
a = [1,2,3,4,['a','b']] 代表在記憶體中開闢了一片空間,裡面是[1,2,3,4,['a','b']],並用變數a指向了這片空間
b = a 代表b指向了變數a的引用,也就是a和b現在指向了同一片空間,當任意a或b對這片空間的列表進行修改,另一個也跟著修改,因為此時a就是b,b就是a,a與b的記憶體地址是一致的
c = copy(a) 代表把a指向的內容複製一份給c,也就是c指向了記憶體中複製出來的這片空間,此時對a或b這個列表進行修改不會對c產生影響,但此時只是淺拷貝,如果對a或b中的列表進行修改,則c也會跟著修改
d = deepcopy(a) 代表把a指向的內容完全拷貝一份賦值給d,此時的d與a,b,c沒有任何關係,只是內容一樣,無論a,b,c怎麼修改,都不會影響到d,反之,無論d怎麼修改,也不會影響到a,b,c,這種拷貝叫深拷貝