【Python基础知识点】Python的浅拷贝和深拷贝

概述

本文主要通过两个简单的代码小例子理解深拷贝和浅拷贝

主体内容

copy 模块提供了浅拷贝和深拷贝的功能。它的主要函数有:
copy(x): 返回对象 x 的浅拷贝。
deepcopy(x): 返回对象 x 的深拷贝。
浅拷贝使用 copy(x) 函数,它只复制了最外层的对象,但内层的对象仍然是引用。此外当我们使用切片操作 [:]、工厂函数如 list() copy模块时,也是使用的浅拷贝,尽管我们创建了一个新的对象,它有自己的内存空间。但是,如果原始对象包含其他对象的引用(如列表中的列表,字典中的列表等),那么新对象和原始对象将共享这些内层对象的同一引用。

让我们通过一个例子来理解这一点:

original_list = [1, 2, [3, 4]]
new_list = original_list[:]  # 使用切片操作进行浅拷贝

print(original_list)  # 输出: [1, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]

# 修改原始列表的第一个元素
original_list[0] = 100
print(original_list)  # 输出: [100, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]

# 修改原始列表中内层列表的第一个元素
original_list[2][0] = 300
print(original_list)  # 输出: [100, 2, [300, 4]]
print(new_list)       # 输出: [1, 2, [300, 4]]

在这个例子中:

我们首先创建了一个列表 original_list,其中包含两个整数和一个内层列表。

我们使用切片操作 [:] 创建了 original_list 的浅拷贝 new_list

然后我们修改original_list 的第一个元素。我们发现 new_list 没有受到影响,因为它是一个独立的对象。

但是,当我们修改 original_list 中内层列表的第一个元素时,我们发现 new_list 中的内层列表也被修改了。这是因为 new_listoriginal_list 共享了内层列表的同一引用。

所以,浅拷贝创建了一个新的对象,但如果原始对象包含其他对象的引用,那么新对象和原始对象将共享这些引用。对原始对象的外层修改不会影响新对象,但对内层对象的修改会影响新对象,因为它们共享同一引用。

如果你想创建一个完全独立的副本,包括内层对象,你需要使用深拷贝(deep copy)。在 Python 中,你可以使用copy模块的deepcopy()函数来创建深拷贝。

深拷贝使用 deepcopy(x) 函数,它创建一个新的复合对象,然后递归地插入原始对象中的对象的副本。这意味着深拷贝也复制了内层对象,深拷贝才是真正意义上我们理解的复制,全须全尾地开辟了一个内存空间复制了一遍。

import copy

original_list = [1, 2, [3, 4]]
new_list = copy.deepcopy(original_list)  # 使用 deepcopy() 函数进行深拷贝

print(original_list)  # 输出: [1, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]

# 修改原始列表的第一个元素
original_list[0] = 100
print(original_list)  # 输出: [100, 2, [3, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]

# 修改原始列表中内层列表的第一个元素
original_list[2][0] = 300
print(original_list)  # 输出: [100, 2, [300, 4]]
print(new_list)       # 输出: [1, 2, [3, 4]]

一句话总结

在大多数情况下,如果你的对象只包含原始数据类型只有一层嵌套,你可以使用浅拷贝。但如果你的对象包含多层嵌套或可变对象,为了确保完全的独立性,你应该使用深拷贝

相关推荐

  1. Python基础知识Python拷贝拷贝

    2024-04-03 19:34:01       36 阅读
  2. python拷贝拷贝

    2024-04-03 19:34:01       39 阅读
  3. 说说Python拷贝拷贝

    2024-04-03 19:34:01       62 阅读
  4. python拷贝拷贝

    2024-04-03 19:34:01       40 阅读
  5. 【测试开发学习历程】python拷贝拷贝

    2024-04-03 19:34:01       39 阅读
  6. Python拷贝拷贝详解

    2024-04-03 19:34:01       54 阅读
  7. python拷贝拷贝

    2024-04-03 19:34:01       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-03 19:34:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-03 19:34:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-03 19:34:01       87 阅读
  4. Python语言-面向对象

    2024-04-03 19:34:01       96 阅读

热门阅读

  1. 当代深度学习模型介绍--Transformer模型

    2024-04-03 19:34:01       32 阅读
  2. 十八、Rust gRPC 多 proto 演示

    2024-04-03 19:34:01       33 阅读
  3. 入门级Python编程题(2)

    2024-04-03 19:34:01       38 阅读
  4. Transformer学习-最简DEMO实现字符串转置

    2024-04-03 19:34:01       27 阅读
  5. 【Linux】linux背景知识

    2024-04-03 19:34:01       36 阅读
  6. web蓝桥杯真题:健身大调查

    2024-04-03 19:34:01       35 阅读
  7. leetcode - 1248. Count Number of Nice Subarrays

    2024-04-03 19:34:01       36 阅读
  8. watch于watcheffect的区别

    2024-04-03 19:34:01       41 阅读
  9. STM32 GPIO输入检测——按键

    2024-04-03 19:34:01       46 阅读
  10. arm架构离线部署docker

    2024-04-03 19:34:01       36 阅读
  11. 短视频中可能触发降权的行为有哪些?

    2024-04-03 19:34:01       40 阅读
  12. Linux文件系统深入解析

    2024-04-03 19:34:01       38 阅读