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

一.普通的变量赋值
我们平常使用的变量赋值就是浅拷贝,即两个变量共享同一个内存块,相同的内存地址,一旦值发生改变,另外一个变量的值也会跟随着一起变化,演示代码如下:
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开发过程中,有些时候对于上面的情况并不是我们想要的,我们更加希望对赋值后的变量做修改并不影响原始变量的值,如何实现呢?这里就需要介绍一下copy模块:
copy.copy() – 浅拷贝,重新分配内存,只拷贝父对象,不会拷贝对象的内部的子对象;
copy.deepcopy() – 深拷贝,重新分配内存,拷贝对象及其所有子对象;

1.浅拷贝copy()
# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:何以解忧
@Blog(个人博客地址): shuopython.com
@WeChat Official Account(微信公众号):猿说python
@Github:www.github.com @File:python_copy.py
@Time:2019/10/27:25 @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.深拷贝deepcopy()
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.浅拷贝和深拷贝区别
对于常规的字典或者列表使用copy模块的深拷贝或者浅拷贝,两者并没有区别!如果字典或者列表中还有包含有子类的话,使用copy模块的深拷贝和浅拷贝的话,结果就大不相同了:
copy.copy() — 重新分配内存,只拷贝父对象,不会拷贝对象内部的子对象;
copy.deepcopy() — 重新分配内存,拷贝对象及其所有子对象;
示例代码如下:
import copy
print("使用浅拷贝:")
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 浅拷贝和深拷贝(9)的更多相关文章
- python浅拷贝和深拷贝
博文参考地址:https://blog.csdn.net/qq_20084101/article/details/82925067 最近在撸码的时候发现了一个严重的问题: a = [1,2] c = ...
- python浅拷贝与深拷贝
今天写程序,人为制造了一个由浅拷贝引起的bug,有必要归纳一下.先附上源代码: class PerformanceTest(object): def __init__(self): ....... s ...
- Python浅拷贝与深拷贝(可变对象与不可变对象)
第一次遇到深拷贝和浅拷贝的问题是用python在一个for循环中对一个list赋值,使用的语句是 a = b 这个b会不断带入循环,每次计算得到,最后发现list乱七八糟的,后来才发现,python中 ...
- python浅拷贝与深拷贝浅析
首先我们要明确,python中大多数都是浅拷贝,我们先说原因: 1.时间花费更少 2.内存更小 3.效率更高,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高. 容器(如列表)切片是浅拷贝
- 学习Python一年,这次终于弄懂了浅拷贝和深拷贝
官方文档:copy主题 源代码: Lib/copy.py 话说,网上已经有很多关于Python浅拷贝和深拷贝的文章了,不过好多文章看起来还是决定似懂非懂,所以决定用自己的理解来写出这样一篇文章. 当别 ...
- 【转】Python中的赋值、浅拷贝、深拷贝介绍
这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下 和很多语言一样,Python中 ...
- 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析
当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...
- python中的深拷贝与浅拷贝
深拷贝和浅拷贝 浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变. 1.对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷 ...
- python的浅拷贝和深拷贝
python对象有两种拷贝的形式:浅拷贝和深拷贝. 在<python核心编程>中看到对这两种拷贝的分析,觉得十分收益,所以记录在此. id()方法:id()方法可以查看某个对象的ID,类似 ...
随机推荐
- get_template_part()调用自定义模板|wordpress函数
我们在用wordpress开发主题的时候,可能需要调用一段固定的代码比如左侧菜单,这段代码会在主页.栏目页.文章页用到,如果直接写入每个页面模板是没有问题,但是如果要改左侧菜单一个链接那就要改三次,很 ...
- Tips on Blind Source Separation
盲源分离是指在不知道源信号和信道传输参数的情况下,根据输入信号的统计特性,仅由观测信号恢复出源信号各个独立成分的过程.盲源分离研究的信号模型主要有三种:线性混合模型.卷积混合模型和非线性混合模型. 1 ...
- CSS块元素、行内元素、行内块元素的转换
一.块元素转行内元素:display:inline 二.行内元素转块元素:display:block div{ display: inline; /*无效 width: 500px; height: ...
- Automatic Ship Detection in Optical Remote Sensing Images Based on Anomaly Detection and SPP-PCANet
基于异常检测和 PCANet 的船舶目标检测 船舶检测会遇到三个问题: 1.船低对比度 2.海平面情况复杂 3.云,礁等错误检测 实验步骤: 1.预处理海陆边界,掩膜陆地 2.异常检测获得感兴趣区域, ...
- uiautomator2使用教程
一.要求 python 3.6+ android 4.4+ 二.介绍 uiautomator2 是一个可以使用Python对Android设备进行UI自动化的库.其底层基于Google uiaut ...
- Git基本介绍(三大分区及核心内部构造)
1. Git三大工作区(工作区.暂存区和版本库) 工作区(WORKING DIRECTORY): 直接编辑文件的地方,肉眼可见直接操作: 暂存区(STAGIN AREA):数据(快照)暂时存放的地方: ...
- 如果判断条件过多,可以直接在computed里面去返回需要判断的数据
bad <div class="offer-item_margin" v-show="offer.supplierName || offer.supplierSto ...
- 【Java 8】巧用Optional之优雅规避NPE问题
避之不及的 NullPointerException NPE : NullPointerException 空指针异常是最常见的Java异常之一,抛出NPE错误不是用户操作的错误,而是开发人员的错误, ...
- 2019_软工实践_Beta(4/5)
队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述 ? 测试新功能中 展示GitHub当日代码/文档签入记录 接下来的计划 ...
- 各大web服务器https的证书文件
nginx key+pem iis pfx+pfx-password.txt tomcat pfx+pfx-password.txt apache key+chain.crt+public.crt
