python--关于赋值与深浅拷贝的认识
作为一个自学python的小白,平时用到深浅拷贝的机会很少,因此对其也是一知半解。但是,作为一个立志成为后端工程狮的男人,眼里揉不了沙子,于是专门花时间补了补课,在此记录一下学习心得。
在讲深浅拷贝之前,首先看一下赋值:
a = "小新"
b = a
print(b)
>> "小新"
b = "辣眼睛" # 对b重新赋值
6 print(b)
7 >> "辣眼睛"
print(a)
>> "小新" # a没有变
这个肯定是没有问题的,接下来用列表试一下:
a = ["小新", "辣眼睛"]
b = a
print(b)
>> ["小新", "辣眼睛"]
b[1] = "DE" # 对b[1]重新赋值
print(b)
>> ["小新", "DE"]
print(a)
>> ["小新", "DE"] # WTF,a怎么会变?
相信有不少小白会跟我一样,在这里就懵圈了,a为什么会变呢,现在来探究一下原理,当我们创建一个变量时,会为变量的值在内存开辟一块空间,这块空间有一个地址(类似于你家的门牌号),变量拿着这个地址找到它赋予的值。废话不多说,看图:
那么变量如果是列表或者字典、元组,同样如此,不过这个时候,变量指向的就不是列表中的内容了,因为变量只能指向一个内存地址,而列表中的元素可以有多个,此时变量指向的是列表的内存地址。列表相当于一个盒子,列表中的元素也会有自己单独的内存地址,元素的内存地址就放在盒子里面,b将列表中的元素改变了之后,盒子里装着的相应元素的内存地址也会发生变化,a再来看盒子来拿的时候,内存地址就是变化之后的了。如图:
接下来看一下浅拷贝:
a = ["小新", "辣眼睛", [0,1]]
b = a.copy()
print(b)
>> ["小新", "辣眼睛", [0,1]]
b[1] = "DE"
print(a) # 我们看下a
>> ["小新", "辣眼睛", [0,1]] # a没有变
b[2][0]="零"
print(a) # 再来看下a
>> ["小新", "辣眼睛", [“零”,1]] # WTF*2,a怎么变了
接下来我们看一下浅拷贝的原理:
b = a.copy(), 这时a 和 b 是一个独立的对象,分别指向不同的内存地址,也就是说a和b现在是两个不同的盒子。所以我们在对b[1]重新赋值了之后,并没有影响到a,但是你可能有疑问了,对b[2][0]重新赋值后,为什么会影响到a呢,这是因为b在拷贝之后,不仅新创建了一个盒子,同时也把a盒子中的内存地址都拿了过来,对b[1]重新赋值,修改了b盒子里面的内存地址,a盒子的内存地址并没有发生变化,所以a[1]不变。对b[2]重新赋值,其实a[2]也不会变,如果是对b[2][0]重新赋值,a[2][0]为什么也变了呢,这是因为浅拷贝只复制到了第一层,也就是b[0]、b[1]、b[2]这一层,如图:
透过上图可以看到,浅拷贝只是复制了第一层,而且只是拷贝了元素的内存地址,如果想要把a中的内容全部复制到b中,我们要借助于深拷贝。
深拷贝
深拷贝不只是新建一个盒子b(也就是内存对象b),而且递归的把a中的元素全部拷贝。深拷贝会将第一层中的列表、元组或字典赋予一个新的内存地址,也就是这个改动,使得我们修改b的同时,不会改变a。
扩展
b = a[:] 也可以将列表a的值赋给b, 其原理跟浅拷贝相同,大家可以测试一下。
python--关于赋值与深浅拷贝的认识的更多相关文章
- python直接赋值、深浅拷贝实例剖析
根据数据类型分为两部分进行剖析: int.str类型 list.tuple.dict类型等 1. int.str类型 [int类型实例] >>> import copy ...
- python——赋值与深浅拷贝
初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...
- 【python】变量的赋值、深浅拷贝
python——赋值与深浅拷贝 https://www.cnblogs.com/Eva-J/p/5534037.html 啥都不说,看这个博主的文章!
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
深浅copy 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. 1 import copy 2 # ######### 数字.字符串 #### ...
- python中的“赋值与深浅拷贝”
Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的 ...
- python语法基础-基础-赋值与深浅拷贝
##################################### 预备知识一——python的变量及其存储 在详细的了解python中赋值.copy和deepcopy之前,我们还是要花一点时 ...
- python学习笔记:深浅拷贝的使用和原理
在理解深浅拷贝之前,我们先熟悉下变量对象和数据类型 1.变量和对象 变量-引用-对象(可变对象,不可变对象) 在python中一切都是对象,比如[1,2],'hello world',123,{'k1 ...
- python之路(三)-深浅拷贝
深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据集合的所有层.所 ...
- python变量存储和深浅拷贝
python的变量及其存储 在高级语言中,变量是对内存及其地址的抽象.对于python而言,python的一切变量都是对象,变量的存储,采用了引用语义的方式,存储的只是一个变量的值所在的内存地址,而不 ...
随机推荐
- noip2015 提高组 解题报告
完美退役...说好的不卡常呢QAQ day1: T1:模拟题?..考察选手将题目描述翻译成代码的能力233 //其实真相是考验rp..论代码雷同的危害233 T2:简单图论,每个点出度为1所以是基环内 ...
- C语言单向链表
1,为什么要用到链表 数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性.但数组也同样存在一些弊病.如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中 ...
- [20160711][VS2012配置OpenCV2.4.9]
相关说明 OpenCV是一套开源机器视觉库,用于简化机器视觉算法的开发与调试. 移植环境 操作系统:Win7 64位 移植软件:Visual Studio 2012 代码下载: https://sou ...
- 初窥React Native
这两天在学习react native,被虐得布耀布耀的,运行一个hello world花了一天时间(手动捂脸). 由于是跟着官网走,所以一开始便是开发环境的搭建.其他的就不说了(详情见 React N ...
- 自实现PC端jQuery版轮播图
最近其他项目不是很忙,被安排给公司的官网项目做一个新的页面(之前没接触公司官网项目),其中有一个用到轮播图的地方,最开始想直接用swiper.js插件实现就好了,可是发现官网项目里之前都没有引入过sw ...
- 迈向c++的一次尝试
从C到C++说着容易做起来也不难,今天做一下尝试. ★:题目介绍:今天是一次尝试所以先从简单的题开始. ★:试题分析:由题可了解到本题目的是要做到由一个数字到一个字符串的转变. 题目简单是由于它只是让 ...
- webpack优化之code splitting
作为当前风头正盛的打包工具,webpack风靡前端界.确实作为引领了一个时代的打包工具,很多方面都带来了颠覆性的改进,让我们更加的感受到自动化的快感.不过最为大家诟病的一点就是用起来太难了. 要想愉快 ...
- ES6中export , export default , import模块系统总结
最近在学习使用Webpack3的时候发现,它已经可以在不使用babel的情况下使用ES6的模块加载功能了. 说到ES6的模块加载功能,我们先复习一下CommonJS规范吧: 一 . CommonJS ...
- PHP面试题:HTTP中POST、GET、PUT、DELETE方式的区别
HTTP定义了与服务器交互的不同的方法,最基本的是POST.GET.PUT.DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post.get.pu ...
- 如何控制input框!
ENTER键可以让光标移到下一个输入框 只能是中文 屏蔽输入法 只能输入英文和数字 只能是数字 只能显示,不能修改 只能输数字,判断按键的值 function onlyNum() { ...