深浅拷贝问题

发布时间 2023-12-06 18:41:11作者: 苏苏!!

深浅拷贝问题

  • copy.copy浅拷贝
  • copy.deepcopy深拷贝

浅拷贝copy.copy

  • copy.copy浅拷贝
    • 原来的拷贝对象------拷贝出了一个新的对象
    • 修改原对象------原对象必须改变-----新对象也会随着原对象的改变而改变。
  • 总结:复制一份原来的对象,如果原来的对象中存在可变数据类型,那么修改原来对象中的可变数据类型之后,原来的对象中数据肯定会改变,浅拷贝后的新对象中的数据也会随着原来对象中的数据而改变。
import copy

"""浅拷贝"""
# #原列表
# old_list=[1,2,3,[11,22]]
# #拷贝的新列表
# new_list=copy.copy(old_list)
# #修改原列表
# old_list[3].append(33)
# #输出源列表和新列表
# print(old_list)
# print(new_list)
# # 原来列表[1, 2, 3, [11, 22, 33]]
# # 新的列表[1, 2, 3, [11, 22, 33]]

深拷贝copy.deepcopy

  • copy.deepcopy深拷贝
    • 原来对象-----拷贝出了一个新对象
    • 修改了原来的对象------原来对象肯定改变----拷贝出来的新对象不会发生改变
  • 总结:复制一份原来的对象,如果原来的对象中存在可变数据类型,那么修改原来对象中的可变数据类型之后,原来的对象中数据肯定会改变,深拷贝后的新对象中的数据不会改变。
import copy

"""深拷贝"""
# #原列表
# old_list=[1,2,3,[11,22]]
# #拷贝的新列表
# new_list=copy.deepcopy(old_list)
# #修改原列表
# old_list[3].append(33)
# #输出源列表和新列表
# print(old_list)
# print(new_list)
# # 原来列表[1, 2, 3, [11, 22, 33]]
# # 新列表[1, 2, 3, [11, 22]]

面试题

"""面试题"""
v1 = [1, 2, 3, 4, 5]#1699375391488
v2 = [v1, v1, v1]
v2[1][0] = 111
v2[2][0] = 222
print(id(v1))
print(id(v2[0]),id(v2[0]),id(v2[0]))#1699375391488 1699375391488 1699375391488
print(v1)#[222, 2, 3, 4, 5]
print(v2)#[[222, 2, 3, 4, 5], [222, 2, 3, 4, 5], [222, 2, 3, 4, 5]]
"""
v1是一个列表,修改列表内的元素不会改变列表的内存地址
v2中的v1仍是同一个内存地址,修改v2中v1列表的元素不会使v1的内存地址发生改变,
所以v2中每个v1元素都是内存地址相同的,相同的内存地址内的元素都相同。
"""