博文参考地址:https://blog.csdn.net/qq_20084101/article/details/82925067

最近在撸码的时候发现了一个严重的问题:

a = [1,2]
c = a
a[0] = 3
print(c) 结果:[3,2]

细心的你,可能已经发现,当我改变的是a[0] 的值时,c的值也跟着改变了

在这里涉及到了一个python的深浅拷贝

1.Phthon中的赋值语句不会创建对象的拷贝,仅仅只是将名称绑定至一个对象,即 a[0] 和 c 是共用一个地址
2.对于不可变对象,通常没有什么差别,即 a = 0
                   b = a
                   a = 1  当 a = 1 时,a 和 b 不在公共同一个地址,a会赋予新地址
3.对于处理可变对象或者可变对象的集合时(数组,字典等),就会出现如上的结果
  但是我们需要的是 修改创建的拷贝时,不改变原始的对象,则需要深拷贝

这是一些概念(浅拷贝:两人共用同一辆奥迪,深拷贝:每一人拥有一模一样的奥迪,一人一辆)

浅拷贝:

浅拷贝意味着构造一个新的集合对象,然后用原始对象中找到的子对象的引用来填充它。
从本质上讲,浅层的复制只有一层的深度。复制过程不会递归,因此不会创建子对象本身的副本。

深拷贝:

深拷贝使复制过程递归。
这意味着首先构造一个新的集合对象,然后递归地用在原始对象中找到的子对象的副本填充它。
以这种方式复制一个对象,遍历整个对象树,以创建原始对象及其所有子对象的完全独立的克隆。

 创建浅拷贝:

list的改变是浅拷贝,因为list只对一层的对象有效,当列表中有子对象,对子对象的修改将影响原始对象和浅拷贝对象

lis = [1,2]
new_lis = list(lis)
lis[0] = 3
print(lis)
print(new_lis) print("---------------------------") li = [[1,2],[3,4]]
new_li = list(li)
li[0][0] = 3
print(li)
print(new_li) 结果:
[[3, 2], [3, 4]]
[[3, 2], [3, 4]]
---------------------------
[3, 2]
[1, 2]

创建深拷贝:

创建深拷贝的的实质时,创建一个独立的对象,即两个对象完全对立(以上述的车为例)

在Python的标准库中的copy模块可以创建深拷贝,这个模块为创建任意python对象的浅拷贝和深拷贝提供了一个简单接口

1.使用deepcopy()

import copy
li = [[1,2],[3,4]]
new_li = copy.deepcopy(li)
li[0][0] = 3
print(li)
print(new_li) 结果:[[3, 2], [3, 4]]
[[1, 2], [3, 4]]

2.使用 copy.copy() 函数可以创建对象的浅拷贝

3.对象可以通过定义特殊的方法 __copy__() 和 __deepcopy__() 来控制如何复制它们。

python浅拷贝和深拷贝的更多相关文章

  1. python 浅拷贝和深拷贝(9)

    何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~     一.普通的变量赋值 我们平常使用的变量赋值就是 ...

  2. python浅拷贝与深拷贝

    今天写程序,人为制造了一个由浅拷贝引起的bug,有必要归纳一下.先附上源代码: class PerformanceTest(object): def __init__(self): ....... s ...

  3. Python浅拷贝与深拷贝(可变对象与不可变对象)

    第一次遇到深拷贝和浅拷贝的问题是用python在一个for循环中对一个list赋值,使用的语句是 a = b 这个b会不断带入循环,每次计算得到,最后发现list乱七八糟的,后来才发现,python中 ...

  4. python浅拷贝与深拷贝浅析

    首先我们要明确,python中大多数都是浅拷贝,我们先说原因: 1.时间花费更少 2.内存更小 3.效率更高,浅拷贝只拷贝顶层数据,一般情况下比深拷贝效率高. 容器(如列表)切片是浅拷贝

  5. 学习Python一年,这次终于弄懂了浅拷贝和深拷贝

    官方文档:copy主题 源代码: Lib/copy.py 话说,网上已经有很多关于Python浅拷贝和深拷贝的文章了,不过好多文章看起来还是决定似懂非懂,所以决定用自己的理解来写出这样一篇文章. 当别 ...

  6. 【转】Python中的赋值、浅拷贝、深拷贝介绍

    这篇文章主要介绍了Python中的赋值.浅拷贝.深拷贝介绍,Python中也分为简单赋值.浅拷贝.深拷贝这几种"拷贝"方式,需要的朋友可以参考下   和很多语言一样,Python中 ...

  7. 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

    当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...

  8. python中的深拷贝与浅拷贝

    深拷贝和浅拷贝 浅拷贝的时候,修改原来的对象,浅拷贝的对象不会发生改变. 1.对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷 ...

  9. python的浅拷贝和深拷贝

    python对象有两种拷贝的形式:浅拷贝和深拷贝. 在<python核心编程>中看到对这两种拷贝的分析,觉得十分收益,所以记录在此. id()方法:id()方法可以查看某个对象的ID,类似 ...

随机推荐

  1. mysql 主主+ Keepalived 高可用

    这是在mysql互为主从的基础上做的 yum -y install keepalived    #两台机器上都装 配置Keepalived主从, vrrp_instance VI_1 { state ...

  2. iOS学习——Quartz2D学习之UIKit绘制

    iOS学习——Quartz2D学习之UIKit绘制 1.总述 在IOS中绘图技术主要包括:UIKit.Quartz 2D.Core Animation和OpenGL ES.其中Core Animati ...

  3. 微信小程序入门(五)

    24.MINA框架讲解 MINA框架架构 25.小程序运行机制 小程序在首次打开的时间会比较长,后续再打开启动会很快,那么小程序是如何启动的呢? 运行机制-启动 冷启动 热启动 热启动:假入用户已经打 ...

  4. asp.net core 系列 8 Razor框架路由(下)

    三.页面路由操作约定 接着上篇讲asp.net core 系列 7 Razor框架路由.在上篇继续第三节 "页面路由操作约定" 的最后一小节 AddPageRoute . 3.3. ...

  5. JavaScript面向对象--封装

    一.封装的概念 面向对象的类包括两大成员,一种是暴露给外部的接口,另一种是只在类内部才能访问的私有属性.在这个类被实例化成对象后,用户只能通过操作给定的接口来访问该类内部的私有属性,这就被称为面向对象 ...

  6. 利用Sklearn实现加州房产价格预测,学习运用机器学习的整个流程(包含很多细节注解)

    Chapter1_housing_price_predict .caret, .dropup > .btn > .caret { border-top-color: #000 !impor ...

  7. demo_3

    ## 控制器层 需求分析: 访问路径:`/user/reg.do`请求参数:`username=xx&password=xx&&phone=xx&email=xx`请求 ...

  8. PHP中private、public、protected的区别详解

    先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 再啰嗦的解释下: ...

  9. mysql修改连接数

    方法一:   进入MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=1000 服务里重起M ...

  10. 测试一波SpringBoot的HTTP吞吐量

    本来,其实就我个人而言现在很少去弄性能这一块的阵地了,主要在做设计与架构,不过前几天刚刚关注公众号的罗哥给我抛了关于性能方面的问题. 一个问题立马引起了我的兴趣,太久没弄性能方面的事情了,所以在隔天有 ...