python 二維數據拷貝,修改A數據,B數據爲什麼跟着改變

def idseach():
    a = [1, [1, 2, 3, 4], 3, 4, 5]
    c = []
    c[:] = a[:]
    print(id(a[1]))
    print(id(c[1]))
    a[0] = 2
    print(a, id(a), id(a[1]))
    print(c, id(c), id(c[1]))

>>>
4322738952
4322738952
[2, [1, 2, 3, 4], 3, 4, 5] 4321320712 4322738952
[1, [1, 2, 3, 4], 3, 4, 5] 4322877640 4322738952

# 此複製方法可以實現c和a一級數據的深拷貝

def idseach():
    a = [1, [1, 2, 3, 4], 3, 4, 5]
    c = []
    c[:] = a[:]
    print(id(a[1]))
    print(id(c[1]))
    # 對嵌套列表數據進行改變
    c[1].append(1)
    print(a, id(a), id(a[1]))
    print(c, id(c), id(c[1]))

>>>
4322738952
4322738952
[2, [1, 2, 3, 4, 1], 3, 4, 5] 4321320712 4322738952
[1, [1, 2, 3, 4, 1], 3, 4, 5] 4322877640 4322738952

# 由此可見,此方法無法對二級數據進行深拷貝,C[1] 和a[1] 的地址一致

如何實現二級數據的改變呢

一種方式:
def idseach():
    a = [1, [1, 2, 3, 4], 3, 4, 5]
    print(id(a))
    a.append(0)
    print(id(a))
    a = a + []
    print(id(a))



>>>
4350639880
4350639880
4352202056

# 解釋:對於上述的修改數據方式,list的內置函數是在數據的地址上進行修改
       如果使用‘+’等運算符,會將list會開闢新的地址存儲list,二維數據的改變而不改變原數據可進行操作:

def idseach():
    a = [1, [1, 2, 3, 4], 3, 4, 5]
    c = []
    c[:] = a[:]
    print(id(a[1]))
    print(id(c[1]))
    c[1] = c[1] + [0]
    print(a, id(a), id(a[1]))
    print(c, id(c), id(c[1]))

>>>
4404257544
4404257544
[1, [1, 2, 3, 4], 3, 4, 5] 4402839304 4404257544
[1, [1, 2, 3, 4, 0], 3, 4, 5] 4404396232 4404457992
# 還有一種修改方式,就是對數據進行深拷貝,此處使用到copy中的deepcopy函數

def idseach():
    a = [1, [1, 2, 3, 4], 3, 4, 5]
    c = copy.deepcopy(a)
    print(id(a[1]))
    print(id(c[1]))
    c[1] = 0
    print(a, id(a), id(a[1]))
    print(c, id(c), id(c[1]))

>>>
4547252872
4547380616
[1, [1, 2, 3, 4], 3, 4, 5] 4545834760 4547252872
[1, 0, 3, 4, 5] 4547379272 4543677472


# 使用deepcopy函數,可以直接對上述的數據進行新的地址copy,完全不用考慮內嵌的層數

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章