当前位置: 首页 > news >正文

python---赋值、浅拷贝、深拷贝

文章目录

  • 1. 赋值 (=)
    • 赋值的特点:
  • 2. 浅拷贝 (copy(),Shallow Copy)
    • 底层原理
    • 创造浅拷贝的方法
  • 3. 深拷贝 (deepcopy(),Deep Copy)
    • 底层原理
    • 深拷贝的特点:
  • 拷贝方式的使用场景
  • 综合示例
  • 相关文章推荐

在Python中,理解赋值、浅拷贝和深拷贝的区别对于避免意外的数据修改非常重要。

1. 赋值 (=)

赋值操作只是创建了一个新的引用,指向同一个对象。

a = [1, 2, [3, 4]]
b = a  # 赋值操作a[0] = 10
print(b)  # 输出: [10, 2, [3, 4]] - b也跟着改变了

赋值的特点:

1、新变量和原变量指向同一个内存地址

2、修改其中一个会影响另一个

3、对于可变对象(列表、字典等)尤其需要注意

2. 浅拷贝 (copy(),Shallow Copy)

浅拷贝会创建一个新对象(顶层容器),但嵌套对象(子对象)的引用保持不变。新对象与原对象共享子对象的内存地址。修改子对象的值会影响原对象,但修改顶层容器的引用不会影响原对象。简单来说,浅拷贝会创建一个新对象,但只拷贝第一层内容,对于嵌套的对象仍然使用引用。

import copya = [1, 2, [3, 4]]
b = copy.copy(a)  # 浅拷贝a[0] = 10
print(b)  # 输出: [1, 2, [3, 4]] - b的第一层不受影响a[2][0] = 30
print(b)  # 输出: [1, 2, [30, 4]] - 嵌套列表被修改了

底层原理

1、浅拷贝仅复制顶层容器的结构,不会递归复制子对象。
2、新对象的每个元素是原对象元素的引用(即指向相同的内存地址)。

创造浅拷贝的方法

1、copy.copy()

2、列表的切片操作 list[:]

3、字典的 dict.copy() 方法

4、集合的 set.copy() 方法

5、构造函数

3. 深拷贝 (deepcopy(),Deep Copy)

深拷贝会创建一个完全独立的新对象,递归复制所有嵌套对象,确保新对象与原对象及其子对象无任何引用关系。修改新对象的任何层级都不会影响原对象。简单来说,深拷贝会递归地拷贝所有嵌套对象,创建一个完全独立的新对象。

底层原理

1、通过递归遍历原对象的所有层级,逐层复制每个子对象,生成全新的内存地址。
2、对于不可变对象(如整数、字符串),深拷贝可能直接引用原值(因为不可变对象无法修改)。
3、对于可变对象(如列表、字典),深拷贝会逐层复制,确保完全独立。

import copya = [1, 2, [3, 4]]
b = copy.deepcopy(a)  # 深拷贝a[0] = 10
a[2][0] = 30
print(b)  # 输出: [1, 2, [3, 4]] - b完全不受影响

深拷贝的特点:

1、创建完全独立的对象副本

2、修改原对象不会影响拷贝后的对象

3、对于嵌套结构特别有用

4、性能开销比浅拷贝大

拷贝方式的使用场景

1、赋值:当你确实需要共享同一个对象时

2、浅拷贝:当对象没有嵌套结构或你确实需要共享嵌套对象时

3、深拷贝:当需要完全独立的副本,特别是对象包含嵌套结构时

综合示例

import copyoriginal = [1, [2, 3], {'a': 4}]# 赋值
assigned = original# 浅拷贝
shallow_copied = copy.copy(original)# 深拷贝
deep_copied = copy.deepcopy(original)# 修改原始对象
original[0] = 10
original[1][0] = 20
original[2]['a'] = 40print("赋值后的:", assigned)        # 完全跟随变化
print("浅拷贝的:", shallow_copied)  # 第一层不变,嵌套对象变化
print("深拷贝的:", deep_copied)     # 完全不变

输出结果:

赋值后的: [10, [20, 3], {'a': 40}]
浅拷贝的: [1, [20, 3], {'a': 40}]
深拷贝的: [1, [2, 3], {'a': 4}]

相关文章推荐

相关文章1

http://www.dtcms.com/a/313111.html

相关文章:

  • 【C 学习】03-你的第一个C程序
  • 上位机知识篇---脚本文件
  • Linux环境下使用Docker搭建多服务环境
  • Corrosion2靶场
  • xxljob总结
  • Obsidian结合CI/CD实现自动发布
  • 1、docker容器命令 | 生命周期管理
  • NX969NX972美光固态闪存NX975NX977
  • python 12 install jupyter时zmq.h或libzmq报错处理
  • MVCC:数据库事务隔离的 “时空魔法”
  • nvm切换本地nodejs环境
  • node中shapefile字符集判断
  • Sklearn 机器学习 数据聚类 KMeans实现聚类
  • wav音频格式中,ACM波形、A/mu-Law Wave、Windows PCM、Microsoft ADPCM的区别
  • 《使用Qt Quick从零构建AI螺丝瑕疵检测系统》——9. 接入真实硬件:驱动USB摄像头
  • LeetCode 分类刷题:2824. 统计和小于目标的下标对数目
  • Go语言--语法基础7--函数定义与调用--自定义函数
  • Go语言实战案例:TCP服务器与客户端通信
  • HoloLens+vuforia打包后遇到的问题
  • 图像、视频、音频多模态大模型中长上下文token压缩方法综述
  • Connection refused: no further information: localhost/127.0.0.1:2375
  • Git的安装和配置
  • JavaWeb开发
  • XSS-DOM 2
  • [硬件电路-150]:数字电路 - 数字电路与模拟电路的异同
  • 洛谷 B3841:[GESP202306 二级] 自幂数判断
  • 当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题
  • 方差 协方差矩阵是什么
  • java的隐式类型转换和强制转换类型
  • 科威特塔观测指南:412米高空俯瞰石油城变迁