目录

  • 一.Python 浅拷贝和深拷贝前言
  • 二.Python 普通的变量赋值
  • 三.Python 浅拷贝和深拷贝
    • 1.Python 浅拷贝 copy
    • 2.Python 深拷贝 deepcopy
    • 3.Python 浅拷贝和深拷贝区别
  • 四.猜你喜欢

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门

一.Python 浅拷贝和深拷贝前言

何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,Python 开发项目的时候说不定你就能碰上这样的坑;

二.Python 普通的变量赋值

我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""list1 = [1,2,3,4,5]
# 普遍的变量赋值
list2 = list1
print(id(list1))
print(id(list2))# 修改列表list2的数据
list2.append(123)
print(list1)
print(list2)'''
输出结果:
2251297055368
2251297055368
[1, 2, 3, 4, 5, 123]
[1, 2, 3, 4, 5, 123]'''

注意:常规的变量赋值共享一个内存块,内存地址相同,一旦值发生改变,共享同一个内存地址的所有变量值都会发生改变,可以直接通过内置函数 id 对比下内存地址即可!

三.Python 浅拷贝和深拷贝

在 Python 开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下 copy 模块:

copy.copy – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;

copy.deepcopy – 深拷贝,重新分配内存,拷贝对象及其所有子对象;

1.Python 浅拷贝 copy

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""import copy
spam = ['A', 'B', 'C', 'D']
# 使用浅拷贝
cheese = copy.copy(spam)
cheese[1] = 42
print(id(spam),spam)
print(id(cheese),cheese)'''
输出结果:
57205555 ['A', 'B', 'C', 'D']
57208888 ['A', 42, 'C', 'D']
'''

2.Python 深拷贝 deepcopy

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""import copy
spam = ['A', 'B', 'C', 'D']
# 使用深拷贝
cheese = copy.deepcopy(spam)
cheese[1] = 42
print(id(spam),spam)
print(id(cheese),cheese)'''
输出结果:
57205555 ['A', 'B', 'C', 'D']
57208888 ['A', 42, 'C', 'D']'''

3.Python 浅拷贝和深拷贝区别

** 对于常规的字典 dict 或者列表 list 使用 copy 模块的深拷贝或者浅拷贝,两者并没有区别!**如果字典或者列表中还有包含有子类的话,使用 copy 模块的深拷贝和浅拷贝的话,结果就大不相同了:

copy.copy — 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;

copy.deepcopy — 重新分配内存,拷贝对象及其所有子对象;

示例代码如下:

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 浅拷贝和深拷贝.py
@Time:2021/3/29 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!"""import copyprint("使用浅拷贝:")
spam = [['A','E'], 'B', 'C', 'D']
# 使用浅拷贝
cheese = copy.copy(spam)
cheese[0][0] = 42
print(id(spam),spam)
print(id(cheese),cheese)
print("***"*20)print("使用深拷贝:")
spam = [['A','E'], 'B', 'C', 'D']
# 使用深拷贝
cheese = copy.deepcopy(spam)
cheese[0][0] = 42
print(id(spam),spam)
print(id(cheese),cheese)'''
输出结果:
使用浅拷贝:
2179653046408 [[42, 'E'], 'B', 'C', 'D']
2179653046920 [[42, 'E'], 'B', 'C', 'D']
************************************************************
使用深拷贝:
2179653086728 [['A', 'E'], 'B', 'C', 'D']
2179653046408 [[42, 'E'], 'B', 'C', 'D']'''

由此可见:

** 如果列表或者字典没有包含子列表或者子字典的话,使用深拷贝或者浅拷贝效果都有一样;**

** 如果列表或者字典中存在子类的时候,只有深拷贝才会为所有的子类也重新分配内存,而浅拷贝只负责父对象,不考虑子对象!!**

四.猜你喜欢

  1. Python 配置环境
  2. Python 变量
  3. Python 运算符
  4. Python 条件判断 if/else
  5. Python while 循环
  6. Python break
  7. Python continue
  8. Python for 循环
  9. Python 字符串
  10. Python 列表 list
  11. Python 元组 tuple
  12. Python 字典 dict
  13. Python 条件推导式
  14. Python 列表推导式
  15. Python 字典推导式

未经允许不得转载:猿说编程 » Python 浅拷贝和深拷贝

Python 浅拷贝和深拷贝 - Python零基础入门教程相关推荐

  1. python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)

    一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...

  2. Python globals 函数 - Python零基础入门教程

    目录 一.Python globals 函数语法 二.Python globals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho ...

  3. Python locals 函数 - Python零基础入门教程

    目录 一.locals 函数语法 二.locals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.locals ...

  4. Python reduce 函数 - Python零基础入门教程

    目录 一.Python reduce 函数简介 1.reduce 函数语法 2.reduce 函数原理 二.Python reduce 函数使用 1.reduce 函数普通使用 2.reduce 函数 ...

  5. Python chr 函数 - Python零基础入门教程

    目录 一.Python chr 函数简介 二.Python chr 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一 ...

  6. Python any 函数 - Python零基础入门教程

    目录 一.Python any 函数简介 二.Python any 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一 ...

  7. Python enumerate 函数 - Python零基础入门教程

    目录 一.Python enumerate 函数介绍 二.Python enumerate 函数使用 1.Python enumerate 函数案例 1 2.Python enumerate 函数案例 ...

  8. Python map 函数 - Python零基础入门教程

    目录 一.前言 二.Python map 函数语法简介 三.Python map 函数实战 1.使用 map 函数 2.map 函数配合 lambda 匿名函数一起使用 四.Python map 函数 ...

  9. Python input 函数 - Python零基础入门教程

    目录 一.前言 二.Python input 函数简介 三.Python input 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pyth ...

  10. Python eval 函数 - Python零基础入门教程

    目录 一.前言 二.Python eval 函数简介 三.Python eval 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...

最新文章

  1. 全球及中国胶合板行业产量规模与营运能力研究报告2022版
  2. android textview 文字居中_Android布局优化,看这3点就够了
  3. OpenGL Volume Texture体积纹理的实例
  4. java json.stringify_JavaScript如何实现JSON.stringify
  5. 二叉树最大路径和 python_[面试题]二叉树中最大路径和
  6. django 1.8 官方文档翻译: 3-4-1 基于类的视图
  7. SQLi LABS Less 23 联合注入+报错注入+布尔盲注
  8. hdoj1000解题报告
  9. JS 获取上传文件的内容
  10. ScrollView嵌套listview高度适应
  11. Privoxy教程使用详解
  12. 深度学习简明教程系列 —— 经典模型(合集)
  13. 二叉树:前序与后序、前序与中序以及中序与后序相同、相反的特征
  14. session 、cookie、token的区别及联系
  15. Web应用十大安全漏洞
  16. HDD硬盘securityATAerase事故(HDD被LOCKED)
  17. 【2020年高被引学者】 田奇 华为
  18. Python:opencv库实现调用摄像头拍照并保存到本地
  19. Meta R-CNN : Towards General Solver for Instance-level Low-shot Learning 论文笔记
  20. Android9.0检测摄像头是否存在源码完整案例

热门文章

  1. 瞧!公务员的工作还可以这样干
  2. Istio从懵圈到熟练 – 二分之一活的微服务
  3. Apache Cassandra 数据存储模型
  4. MSSQL实践-数据库备份加密
  5. 当学术大家遇到技术大拿,如何攻克数据库应用头号难题?数位产学研大咖这样解读
  6. 飞天2.0 | 万物智能的基础服务
  7. 三招提升数据不平衡模型的性能(附python代码)
  8. 超干货|使用Keras和CNN构建分类器(内含代码和讲解)
  9. PostgreSQL Oracle 兼容性之 - rownum
  10. PyODPS 中使用 Python UDF