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

 

 

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