avatar

RWO.cc

读一次写一次

  • 首页
  • 搭建手册
  • 笔记
  • 短视频
  • 关于
  • 🌈200粉丝🌈
Home 深拷贝与浅拷贝
文章

深拷贝与浅拷贝

Posted 2024-08-29 Updated 2024-08- 26
By RWO.
7~9 min read

在 Python 中,浅拷贝和深拷贝是两种用于复制对象的方法,它们之间的主要区别在于它们如何处理嵌套的可变对象(如列表、字典等)。下面将详细解释这两种拷贝方式,并通过示例来说明它们的区别。

1. 浅拷贝(Shallow Copy)

浅拷贝会创建一个新的对象,但它只是将原始对象中元素的引用复制到新对象中。也就是说,浅拷贝后的新对象与原对象共享嵌套对象的引用。如果你在新对象中修改这些嵌套对象,那么原对象中的对应部分也会受到影响。

示例:

import copy

original_list = [1, 2, [3, 4], 5]
shallow_copied_list = copy.copy(original_list)

# 修改浅拷贝后的列表中的嵌套列表元素
shallow_copied_list[2][0] = 'a'

print("Original list:", original_list)  # 输出: [1, 2, ['a', 4], 5]
print("Shallow copied list:", shallow_copied_list)  # 输出: [1, 2, ['a', 4], 5]

说明:在这个例子中,shallow_copied_list 是 original_list 的浅拷贝。当我们修改 shallow_copied_list 中的嵌套列表 [3, 4] 中的第一个元素时,original_list 中的相应部分也受到了影响。这是因为浅拷贝只复制了对象的引用,而不是对象本身。

2. 深拷贝(Deep Copy)

深拷贝会创建一个全新的对象,同时递归地复制所有嵌套对象,从而使得新对象与原对象完全独立。深拷贝后的新对象与原对象在任何层次上都不共享引用,因此在新对象中的修改不会影响到原对象。

示例:

import copy

original_list = [1, 2, [3, 4], 5]
deep_copied_list = copy.deepcopy(original_list)

# 修改深拷贝后的列表中的嵌套列表元素
deep_copied_list[2][0] = 'a'

print("Original list:", original_list)  # 输出: [1, 2, [3, 4], 5]
print("Deep copied list:", deep_copied_list)  # 输出: [1, 2, ['a', 4], 5]

说明:在这个例子中,deep_copied_list 是 original_list 的深拷贝。即使我们修改 deep_copied_list 中的嵌套列表,original_list 仍然保持不变。这是因为深拷贝在复制对象时递归地复制了所有嵌套对象,而不是仅仅复制它们的引用。

3. 何时使用浅拷贝与深拷贝

  • 浅拷贝适用于以下情况:

    • 你要复制的对象不包含嵌套的可变对象,或你希望新对象与原对象共享嵌套的可变对象。
    • 复制简单的、扁平的对象(如列表、字典等),而不关心深层次的修改是否影响原对象。
  • 深拷贝适用于以下情况:

    • 你要复制的对象包含嵌套的可变对象,并希望新对象完全独立于原对象。
    • 你不希望新对象的任何修改影响到原对象。

总结

  • 浅拷贝:复制对象,但不会递归复制嵌套对象;浅拷贝的对象与原对象共享嵌套的可变对象。
  • 深拷贝:递归地复制整个对象,包括所有嵌套对象;深拷贝的对象与原对象完全独立。

扩展说明

1. 浅拷贝的特性

浅拷贝对于复制简单的对象足够有效,但如果对象内部嵌套了其他可变对象,浅拷贝只会复制最外层的对象,对于内部的可变对象仍然是引用。

original_list = [[1, 2, 3], [4, 5, 6]]
shallow_copied_list = copy.copy(original_list)
shallow_copied_list[0][0] = 10

print(original_list)        # 输出: [[10, 2, 3], [4, 5, 6]]
print(shallow_copied_list)  # 输出: [[10, 2, 3], [4, 5, 6]]

解释:修改 shallow_copied_list[0][0] 导致 original_list 中的相同元素也被修改,因为它们共享了对内部列表 [1, 2, 3] 的引用。

2. 深拷贝的特性

深拷贝则会递归复制整个对象,包括所有嵌套的可变对象,因此新对象与原对象完全独立,任何一方的修改不会影响到另一方。

original_list = [[1, 2, 3], [4, 5, 6]]
deep_copied_list = copy.deepcopy(original_list)
deep_copied_list[0][0] = 10

print(original_list)        # 输出: [[1, 2, 3], [4, 5, 6]]
print(deep_copied_list)     # 输出: [[10, 2, 3], [4, 5, 6]]

解释:这里 deep_copied_list[0][0] 的修改不会影响到 original_list,因为深拷贝创建了完全独立的副本。

理解浅拷贝和深拷贝的区别,能够帮助我们更好地处理复杂数据结构,避免因为不经意的修改引起的潜在问题。

短视频
每日一点 短视频 Python
License:  CC BY 4.0
Share

Further Reading

Nov 3, 2024

什么是 python 的闭包

在 Python 中,闭包(Closure)是一种函数对象,它不仅包含了函数的代码,还包含了函数创建时的环境变量。这意味着闭包可以“记住”其外部作用域中的变量,即使在外部作用域已经结束后,闭包仍然可以访问这些变量。 函数可以访问他被创建时所处的上下文环境,这被称为闭包。 闭包的基本特征 嵌套函数:闭

Nov 2, 2024

使用argparse模块解析命令行参数

在 Python 中,argparse 模块用于解析命令行参数,使得脚本可以更灵活地接受用户输入。以下是如何使用 argparse 模块解析命令行参数的详细介绍和示例。 基本用法 示例:简单的命令行参数解析 首先,创建一个简单的脚本来解析命令行参数。我们将创建一个脚本,该脚本接受两个整数并打印它们的

Nov 1, 2024

Python中的二维码生成与解析(花里胡哨)

如何使用 qrcode 库生成各种有趣的二维码,包括彩色二维码、带 Logo 的二维码和动态 GIF 二维码。下面,我们将逐步介绍这些功能。 Qrcode 库简介 qrcode 库是一个强大的 Python 工具,用于生成二维码。除了基本的二维码,它还支持自定义功能,如颜色变化、样式设计和动画效果。

OLDER

`try`、`except`、`else` 和 `finally` 语句的执行顺序

NEWER

2FAuth--双因素身份验证器

Recently Updated

  • 什么是 python 的闭包
  • 使用argparse模块解析命令行参数
  • Python中的二维码生成与解析(花里胡哨)
  • Python中的二维码生成与解析(基础使用)
  • 使用platform模块获取系统信息

Trending Tags

学习 Git 工具 SQL docker-compose 每日一点 快捷键 Flink fastapi Windows

Contents

©2025 RWO.cc. Some rights reserved.

Using the Halo theme Chirpy