1. 程式人生 > >python中的賦值與深淺拷貝

python中的賦值與深淺拷貝

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,這種拷貝叫深拷貝