Python 浅拷贝和深拷贝 - Python零基础入门教程
目录
- 一.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']'''
由此可见:
** 如果列表或者字典没有包含子列表或者子字典的话,使用深拷贝或者浅拷贝效果都有一样;**
** 如果列表或者字典中存在子类的时候,只有深拷贝才会为所有的子类也重新分配内存,而浅拷贝只负责父对象,不考虑子对象!!**
四.猜你喜欢
- Python 配置环境
- Python 变量
- Python 运算符
- Python 条件判断 if/else
- Python while 循环
- Python break
- Python continue
- Python for 循环
- Python 字符串
- Python 列表 list
- Python 元组 tuple
- Python 字典 dict
- Python 条件推导式
- Python 列表推导式
- Python 字典推导式
未经允许不得转载:猿说编程 » Python 浅拷贝和深拷贝
Python 浅拷贝和深拷贝 - Python零基础入门教程相关推荐
- python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)
一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...
- Python globals 函数 - Python零基础入门教程
目录 一.Python globals 函数语法 二.Python globals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pytho ...
- Python locals 函数 - Python零基础入门教程
目录 一.locals 函数语法 二.locals 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一.locals ...
- Python reduce 函数 - Python零基础入门教程
目录 一.Python reduce 函数简介 1.reduce 函数语法 2.reduce 函数原理 二.Python reduce 函数使用 1.reduce 函数普通使用 2.reduce 函数 ...
- Python chr 函数 - Python零基础入门教程
目录 一.Python chr 函数简介 二.Python chr 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一 ...
- Python any 函数 - Python零基础入门教程
目录 一.Python any 函数简介 二.Python any 函数使用 三.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 一 ...
- Python enumerate 函数 - Python零基础入门教程
目录 一.Python enumerate 函数介绍 二.Python enumerate 函数使用 1.Python enumerate 函数案例 1 2.Python enumerate 函数案例 ...
- Python map 函数 - Python零基础入门教程
目录 一.前言 二.Python map 函数语法简介 三.Python map 函数实战 1.使用 map 函数 2.map 函数配合 lambda 匿名函数一起使用 四.Python map 函数 ...
- Python input 函数 - Python零基础入门教程
目录 一.前言 二.Python input 函数简介 三.Python input 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Pyth ...
- Python eval 函数 - Python零基础入门教程
目录 一.前言 二.Python eval 函数简介 三.Python eval 函数实战 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python ...
最新文章
- 全球及中国胶合板行业产量规模与营运能力研究报告2022版
- android textview 文字居中_Android布局优化,看这3点就够了
- OpenGL Volume Texture体积纹理的实例
- java json.stringify_JavaScript如何实现JSON.stringify
- 二叉树最大路径和 python_[面试题]二叉树中最大路径和
- django 1.8 官方文档翻译: 3-4-1 基于类的视图
- SQLi LABS Less 23 联合注入+报错注入+布尔盲注
- hdoj1000解题报告
- JS 获取上传文件的内容
- ScrollView嵌套listview高度适应
- Privoxy教程使用详解
- 深度学习简明教程系列 —— 经典模型(合集)
- 二叉树:前序与后序、前序与中序以及中序与后序相同、相反的特征
- session 、cookie、token的区别及联系
- Web应用十大安全漏洞
- HDD硬盘securityATAerase事故(HDD被LOCKED)
- 【2020年高被引学者】 田奇 华为
- Python:opencv库实现调用摄像头拍照并保存到本地
- Meta R-CNN : Towards General Solver for Instance-level Low-shot Learning 论文笔记
- Android9.0检测摄像头是否存在源码完整案例