python之深浅拷贝
1. 什么是深浅拷贝
- 我的理解:
- 浅拷贝:列表嵌套列表,子列表会变,父列表不会变
- 深拷贝:都不变
1.1 赋值
- 赋值不是拷贝
l1 = [1,2,3,4,[5,6,7,]]
l2 = l1 # 赋值 赋值不是拷贝 多个变量指向同一个内存地址 一个变都变
l1.append(8)
print(l1)
print(l2)
'''
输出结果
[1, 2, 3, 4, [5, 6, 7], 8]
[1, 2, 3, 4, [5, 6, 7], 8]
'''
# 个人见解:
# 赋值都指向同一个内存地址,值相同,值发生变化都变化
1.2 浅拷贝
- 只拷贝第一层
- 浅拷贝会创建一个新的列表(容器)
- 新创建的列表中的元素和原列表的元素用的是同一个内存空间
l1 = [1,2,3,4,[4,5,6]]
l2 = l1[:] # 浅拷贝
l2 = l1.copy() # 浅拷贝 -- 只拷贝第一层
print(id(l1[0]))
print(id(l2[0]))
'''
输出结果
4438958224
4438958224
很明显内存地址相同
'''
# 个人见解:
# l1中的[4,5,6]会变,外层不会变
1.3 深拷贝
-
不可变的数据类型和原列表指向同一个空间
-
可变数据会创建一个新的空间
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
li[-1].append(678)
print(li)
print(l2)
'''
输出结果
[1, 2, 3, 4, 5, [6, 7, 8, 678]]
[1, 2, 3, 4, 5, [6, 7, 8]]
'''
import copy
li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
l2 = copy.deepcopy(li)
li[-1]['k'] = "a"
print(li)
print(l2)
[3, 4, 5, [1, 2, 3, 4], 6, 7, 8, {'k': 'a'}]
[3, 4, 5, [1, 2, 3, 4], 6, 7, 8, {'k': 'v'}]
'''
个人见解:
深拷贝都不变
'''
2. 深浅拷贝怎么用
dic = {} # "v":4
li = [] #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
for i in range(0,5):
dic["v"] = i
li.append(dic)
print(li)
'''
输出结果
[{'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}, {'v': 4}]
'''
3. 深浅拷贝在哪里用
- 1.面试
- 2.不让修改原数据的时候,使用
电脑教学 鼠标写字工具
4. 练习题
# 看代码写结果
l1 = [1,2,3,4,[5,6,7,]]
l2 = l1 # 赋值 赋值不是拷贝
l1.append(8)
print(l1)
print(l2)
'''
结果:
'''
l1 = [1,2,3,4,[4,5,6]]
l2 = l1[:] # 浅拷贝
l2 = l1.copy() # 浅拷贝 -- 只拷贝第一层
print(id(l1[0]))
print(id(l2[0]))
'''
结果
'''
l1 = [1,2,3,4]
l2 = l1.copy()
print(l1)
print(id(l1))
print(id(l2))
print(id(l1[0]))
print(id(l2[0]))
'''
结果
'''
li = [1,2,32,[3,4,5]]
l2 = li.copy()
li.append(8)
print(l2)
print(li)
li[-1].append(8)
print(l2)
'''
结果
'''
l1 = [1,2,3,(1,2,3)]
l2 = l1.copy()
l2[-1] = 6
print(l1)
print(l2)
'''
结果
'''
l1 = [1,2,3,4,[5,6,7,]]
l2 = l1.copy()
l1[-1].append(8)
print(l2)
'''
结果
'''
li = [1,2,3,4,]
l2 = li # 赋值 两个变量指向了一个列表内存地址
li.append(9)
print(l2)
'''
结果
'''
l1 = [1,2,3,4,5,]
l2 = l1.copy()
l1.append(8)
print(l2)
print(l1)
'''
结果
'''
l1 = [1,2,3,[4,5,6]]
l2 = l1.copy()
l2[-1] = 77
print(l1)
print(l2)
'''
结果
'''
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
print(li)
# print(id(li))
print(id(li[-1]))
print(l2)
# print(id(l2))
print(id(l2[-1]))
'''
结果
'''
import copy
li = [1,2,3,4,5,[6,7,8]]
l2 = copy.deepcopy(li)
li[-1].append(678)
print(l2)
'''
结果
'''
import copy
li = [3,4,5,[1,2,3,4],6,7,8,{"k":'v'}]
l2 = copy.deepcopy(li)
li[-1]['k'] = "a"
print(li)
print(l2)
'''
结果
'''
dic = {} # "v":4
li = [] #[{"v":0},{"v":1},{"v":2},{"v":3},{"v":4}]
for i in range(0,5):
dic["v"] = i
li.append(dic)
print(li)
'''
结果
'''