Python 深複製、淺複製的問題

目錄

1.直接等號賦值

2.copy.copy

3.copy.deepcopy()

4.元組的複製


1.直接等號賦值

a is b, a[i] is b[i]

a=[1,2,3];
c=a;
c[0]=10;
print(a);
print(c);
==================
[10, 2, 3]
[10, 2, 3]

被賦值對象認爲是原對象的引用,兩個變量指向同一個對象,其中一個變量發生變化,另一個變量也隨之變化。兩個變量的id是相同的。

2.copy.copy

a is not b, a[i] is b[i]

淺複製,兩個變量共享子對象

淺複製:兩個變量的地址即id不同,但兩個變量的元素還是共享同一個地址id

這個地方還是沒搞明白,爲什麼id相同,還會a變b不變呢?

import copy

f=['a','b','c',['d','e']];
g=copy.copy(f);

print(g)
print(f)
print(id(g))
print(id(f))
print(id(g[1]))
print(id(f[1]))
print(id(g[3]))
print(id(f[3]))
=============================
['a', 'b', 'c', ['d', 'e']]
['a', 'b', 'c', ['d', 'e']]
2442999778312
2442999776712
#變量id不同
2442851121896
2442851121896
2442999778440
2442999778440
#變量子元素id相同
=============================
g[0]=10;
print(g)
print(f)
=============================
[10, 'b', 'c', ['d', 'e']]
['a', 'b', 'c', ['d', 'e']]
=============================
g[3].append('f')
print(g)
print(f)
=============================
[10, 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f']]
==============================
g[3]='f'
print(g)
print(f)
==============================
[10, 'b', 'c', 'f']
['a', 'b', 'c', ['d', 'e', 'f']]

3.copy.deepcopy()

a is not b, a[i] is not b[i]

深複製,此時兩個變量爲獨立的對象,互不影響

f=['a','b','c',['d','e']];

g=copy.deepcopy(f);
g[0]=10;
print(g)
print(f)

g[3].append('f')
print(g)
print(f)
=============================
[10, 'b', 'c', ['d', 'e']]
['a', 'b', 'c', ['d', 'e']]
[10, 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e']]

4.元組的複製

列表是可修改的,而元組就是不可修改的列表,不能給元組的元素進行賦值。元組id不變。

import copy

a_tuple=(1,2);
b=copy.copy(a_tuple);
c=copy.deepcopy(a_tuple);
print(b==c)
print(id(b)==id(c));

testlist=[3,4];
cc=copy.copy(testlist);
dd=copy.deepcopy(testlist)
print(cc==dd)
print(id(cc)==id(dd))
=================================
True
True
True
False

5.使用切片、for循環遍歷賦值方法

淺複製,同copy.copy相同,只對第一層即第一個維度進行深複製

a=['a','b','c',['d','e']];
b=a[:]
print(id(a))
print(id(b))

b[3].append('f')
print(a)
print(b)
=============================
2443000001544
2442999783752
['a', 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f']]
a=['a','b','c',['d','e']];
b=[]
for i in a:
    b.append(i)
print(id(a))
print(id(b))

b[3].append('f')
print(a)
print(b)

===============================
2443000004488
2443000003976
['a', 'b', 'c', ['d', 'e', 'f']]
['a', 'b', 'c', ['d', 'e', 'f']]

 

參考:https://www.cnblogs.com/xueli/p/4952063.html

 

 

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