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,完全不用考慮內嵌的層數