python之深浅拷贝

时间:2021-05-27 19:49:36

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)
'''
结果

'''