目录
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']]
6.函数调用
def main(a):
a[2].append('c')
print(a)
if __name__=='__main__':
b=[1,2,['a','b']]
main(b)
print(b)
=================================
[1, 2, ['a', 'b', 'c']]
[1, 2, ['a', 'b', 'c']]
函数体外的参数b也发生了变化,所以需要在函数体内处理多维列表时,最好先对参数进行深复制,再传入函数,以免发生上述情况。
参考:https://www.cnblogs.com/xueli/p/4952063.html