Python的深浅拷贝

时间:2023-12-31 11:52:34

Python的深浅拷贝

深浅拷贝
1. 赋值,对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量并不是复制一份内容

 list1 = ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '']]
list2 = list1
print("list1的内容为:",list1,"list1的内存地址为:",id(list1))
list2的内容为: ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '']] list1的内存地址为: 2006224427976
print("list2的内容为:",list2,"list1的内存地址为:",id(list2))
list2的内容为: ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '']] lis2的内存地址为: 2006224427976

所以lst1的内存指向和lst2是⼀样的list1改变了list2也发生了改变

 list1 = ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '']]
list2 = list1
list1.append("我是YJ呀") #在list1中最后追加内容
print("list1",list1)
list1 ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', ''], '我是YJ呀']
print("list2",list2)
list2 ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', ''], '我是YJ呀']

2. 浅拷贝,只拷贝第一层内容 [:]   copy()

 list1 = ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '']]
list2 = list1[:]  #利用切片拷贝,索引从头到尾不填代表全部,浅拷贝
list3 = list1.copy()  #利用copy函数拷贝,浅拷贝
4 print('list1的内容为:',list1,'list1的内存地址为:',id(list1))
5 list1的内容为: ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '19']] list1的内存地址为: 2201519417800
6 print('list2的内容为:',list2,'list2的内存地址为:',id(list2))
7 list2的内容为: ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '19']] list2的内存地址为: 2201519417672
8 print('list3的内容为:',list3,'list3的内存地址为:',id(list3))
9 list3的内容为: ['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '19']] list3的内存地址为: 2201519417928

3. 深拷贝,把这个对象内部的内容全部拷贝一份,引入copy模块,deepcopy()

 import copy  #导入copy模块
list1 = ['python','PHP','java','C',['name','YJ','age','']]  #定义一个列表
list2 = copy.deepcopy(lst1)  #把list1深拷贝一份赋值给list2
print(list2)  #输出
['python', 'PHP', 'java', 'C', ['name', 'YJ', 'age', '']]

  2019年11月5日