深浅拷贝

发布时间 2023-12-07 14:20:18作者: 小满三岁啦

首先需要明确一点:在什么情况下讨论深浅拷贝。对于不可变数据类型的变量不存在深浅拷贝问题。深浅拷贝讨论的对象是可变数据类型的变量,如列表、字典等。

在 Python 中,深拷贝(deep copy)和浅拷贝(shallow copy)是用于复制对象的概念。

浅拷贝创建了一个新对象,该对象与原始对象共享内部对象的引用。如果原始对象中存在可变对象(如列表、字典等),则更改拷贝对象或原始对象中的这些可变对象将相互影响。

深拷贝创建了一个全新的对象,它复制了原始对象及其所有内部对象的副本。即使原始对象中存在可变对象,深拷贝的结果也是完全独立的对象,对其中一个对象的更改不会影响另一个对象。

可以使用 copy 模块中的 copy 函数来执行浅拷贝,使用 copy 模块中的 deepcopy 函数来执行深拷贝。

import copy

# 原始列表
msg_list = [1, "小满", ["我等你到三十五岁"], {"余华": "活着"}]
print(f"原列表内的列表的内存地址: {id(msg_list[2])}")

# 浅拷贝
shallow_copy_list = copy.copy(msg_list)
print(f"浅拷贝内的列表的内存地址: {id(shallow_copy_list[2])}")

# 深拷贝
deep_copy_list = copy.deepcopy(msg_list)
print(f"深拷贝内的列表的内存地址: {id(deep_copy_list)}")

# 修改原列表的内容,观察结果
msg_list[0] = True
msg_list[2].append("什么都明白的人最温柔也最冷漠")

print()

# 打印原列表
print(f"原列表: {msg_list}")

# 打印浅拷贝结果
print(f"浅拷贝: {shallow_copy_list}")

# 打印深拷贝结果
print(f"深拷贝: {deep_copy_list}")

输出结果如下:

原列表内的列表的内存地址: 1592237873856
浅拷贝内的列表的内存地址: 1592237873856
深拷贝内的列表的内存地址: 1592237874240

原列表: [True, '小满', ['我等你到三十五岁', '什么都明白的人最温柔也最冷漠'], {'余华': '活着'}]
浅拷贝: [1, '小满', ['我等你到三十五岁', '什么都明白的人最温柔也最冷漠'], {'余华': '活着'}]
深拷贝: [1, '小满', ['我等你到三十五岁'], {'余华': '活着'}]

从输出结果可以看出,对浅拷贝对象进行修改后,原始对象也被影响到,因为它们共享了内部对象的引用。而对深拷贝对象的修改不会影响原始对象,因为它们是完全独立的副本。

友情链接