python浅拷贝和深拷贝
博文参考地址: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浅拷贝和深拷贝的更多相关文章
- python 浅拷贝和深拷贝(9)
何谓浅拷贝/深拷贝,说得直白一点,其实就是数据拷贝,两者到底有什么区别呢?听着就挺迷糊的,python开发项目的时候说不定你就能碰上这样的坑~~ 一.普通的变量赋值 我们平常使用的变量赋值就是 ...
- 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,类似 ...
随机推荐
- 浏览器与服务端请求响应流程与HTTP协议
浏览器与服务端请求响应流程图: 1.HTTP概要 1.1. 定义 HTTP(HyperText Transfer Protocol,超文本传输协议)最早就是计算机与计算机之间沟通的一种标准协议,这种 ...
- 关于移动端开发,vedio标签层级高遮挡蒙版的解决方案
问题描述: 使用famework7框架搭建了一个界面,然后再界面中需要使用蒙版效果,在PC端,ios测试没有问题,在Andriod播放视屏再点击显示蒙版的效果师,视频会遮盖蒙版.修改定位,z-inde ...
- 汉诺塔问题其实很简单 Python 递归经典面试题
话不多说,上代码 1 def hanoi_move(n, source, dest, intermediate): 2 if n >= 1: # 递归出口,只剩一个盘子 3 hanoi_move ...
- Django+Bootstrap+Mysql 搭建个人博客(一)
1.1.环境搭建 (1)虚拟环境 mkvirtualenv website pip install django==1.11.7 (2)创建项目和app:website和blog (3)设置中文set ...
- JVM基础系列开篇:为什么要学虚拟机?
跟许多人一样,我一开始接触 Java 虚拟机只是因为面试需要用到,所以硬着头皮看看.所以很多人对于为什么要学虚拟机这个问题,他们的答案都是:因为面试.但我经过了几年的学习和实战,我发现其实学习虚拟机并 ...
- Jenkins 集群搭建
一.前言 Jenkins是当下比较流行的一款功能强大的持续集成工具,它支持搭建集群,来提高多项目的构建速度,模式为主从模式,master会将任务分配到各个从节点进行并发构建,从而提高速度,下面介绍一下 ...
- vue keep-alive 实现详情返回列表保留页面数据
实现功能 详情页返回列表页,列表页保留上次浏览位置 其它页面进入到列表表,列表页刷新 当详情页有数据改变时,列表页也要更新该条数据 实现思路 用keep-alive保留列表页面数据 activated ...
- Asp.Net SignalR 集群会遇到的问题
SignalR集群 当客户端数量上来,一台server自然是吃不消的.多个server集群部署是必然的解决方案.再通过负载均衡,嗯 简直是完美.但是问题也接踵而来.每个server只能管理到当前ser ...
- [十六]JavaIO之InputStreamReader 与 OutputStreamWriter
简介 InputStreamReader OutputStreamWriter是转换流 InputStreamReader 是字节流通向字符流的桥梁,它将字节流转换为字符流. OutputStre ...
- Django 系列博客(十六)
Django 系列博客(十六) 前言 本篇博客介绍 Django 的 forms 组件. 基本属性介绍 创建 forms 类时,主要涉及到字段和插件,字段用于对用户请求数据的验证,插件用于自动生成 h ...