python赋值,深拷贝和浅拷贝的区别
1.赋值
list1=[[1,2],'fei',66]
list2=list1
list1
[[1, 2], 'fei', 66]
list2
[[1, 2], 'fei', 66]
list2.append(77)
list2
[[1, 2], 'fei', 66, 77]
list1
[[1, 2], 'fei', 66, 77]
id(list1),id(list2)
(72624608, 72624608)
总结:list1赋值给list2,其实就是list2引用了list1.两个变量指向同一个对象,顾当list2增加一个元素时list1也会增加
2.浅拷贝
使用的方法:copy.copy()
代码示例:
>>> import copy
>>> list1=[[1,2],'fei',66]
>>> list2=copy.copy(list1)
>>> print(id(list1))
55713024
>>> print(id(list2))
55712864
>>> print(id(list1[0]),'\n',id(list2[0]))
55712184
55712184
>>> print(id(list1[1]),'\n',id(list2[1]))
61987040
61987040
>>> print(id(list1[2]),'\n',id(list2[2]))
2057136240
2057136240 #总结:list2浅拷贝list1,list1与list2的id不一样,但是列表里面每个单独的元素id是一样的 >>>list1=[[1,2],'fei',66]
>>> list2=copy.copy(list1)
>>> list1
[[1, 2], 'fei', 66]
>>> list2
[[1, 2], 'fei', 66]
>>> list1[0][0]=11
>>> list1
[[11, 2], 'fei', 66]
>>> list2
[[11, 2], 'fei', 66]
>>> list1[1]='change'
>>> list1
[[11, 2], 'change', 66]
>>> list2
[[11, 2], 'fei', 66] #总结:改变list1中第一个元素列表的值时,list2中第一个元素的值也相应改变,改变list1中第二个元素的值时,list2中第二个元素的值未改变(第一个元素列表是可变对象,第二个元素字符串是不可变对象)
最后总结:浅拷贝后,改变原始对象中可变类型的元素的值会同时影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(只拷贝了父级,子级未拷贝)
3.深拷贝
使用的方法:copy.deepcopy()
代码示例:
>>> list1=[[1,2],'fei',66]
>>> list3=copy.deepcopy(list1)
>>> print(id(list1),'\n',id(list2))
62055888
55713624
>>> print(id(list1[0]),'\n',id(list2[0]))
55726368
55713704
>>> print(id(list1[1]),'\n',id(list2[1]))
61987040
61987040
>>> print(id(list1[2]),'\n',id(list2[2]))
2057136240
2057136240 #总结:list3深拷贝list1,list1与list3的id不一样,list1中可变对象的元素与list3中的id不一样,list1中不可变对象的元素与list3中的id一样 >>> list1[0][0]=11
>>> list1
[[11, 2], 'fei', 66]
>>> list3
[[1, 2], 'fei', 66]
>>> list1[1]='change'
>>> list1
[[11, 2], 'change', 66]
>>> list3
[[1, 2], 'fei', 66]
>>> id(list1[1])
62058944
>>> id(list3[1])
61987040 #总结:list3深拷贝list1,list1中的可变元素修改后,list3中的可变元素不会发生变化,list1中的不可变元素修改后,list3中的不可变元素亦不会发生变化
最后总结:深拷贝后,改变原始对象中可变类型的元素的值会不会影响拷贝对象,改变原始对象中不可变类型的元素的值,不会影响拷贝对象(父级与子级都会拷贝)
python赋值,深拷贝和浅拷贝的区别的更多相关文章
- Python中深拷贝与浅拷贝的区别
转自:http://blog.csdn.net/u014745194/article/details/70271868 定义: 在Python中对象的赋值其实就是对象的引用.当创建一个对象,把它赋值给 ...
- python 中深拷贝和浅拷贝的区别
通俗的理解,浅就是外面,深就是里面.浅拷贝的意思就是只拷贝外面的一层,深拷贝就是拷贝的里面的所有. 看两段代码: 元组: #!/usr/bin/env/python # -*-coding:utf-8 ...
- Python 深拷贝和浅拷贝的区别
python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 ...
- 【Python】直接赋值,深拷贝和浅拷贝
直接赋值: 对象的引用,也就是给对象起别名 浅拷贝: 拷贝父对象,但是不会拷贝对象的内部的子对象. 深拷贝: 拷贝父对象. 以及其内部的子对象 在之前的文章中,提到可变对象和不可变对象,接下来也是以这 ...
- python 中 深拷贝和浅拷贝的理解
在总结 python 对象和引用的时候,想到其实 对于python的深拷贝和浅拷贝也可以很好对其的进行理解. 在python中,对象的赋值的其实就是对象的引用.也就是说,当创建一个对象,然后赋给另外一 ...
- Python中复制、深拷贝和浅拷贝的区别
深拷贝定义(deepcopy) 在Python中,由于一切皆对象,所以任何变量都可以被引用,也即可以被赋值给任何变量.但是在Python中,给变量赋值,是区分的,一般情况下,Python中的变量赋值都 ...
- python深拷贝和浅拷贝的区别
首先深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,他们本质的区别是拷贝出来的对象的地址是否和原对象一样,也就是地址的复制还是值的复制的区别. 什么是可变对象,什么是不可变对象: 可变对象 ...
- 【python测试开发栈】—理解python深拷贝与浅拷贝的区别
内存的浅拷贝和深拷贝是面试时经常被问到的问题,如果不能理解其本质原理,有可能会答非所问,给面试官留下不好的印象.另外,理解浅拷贝和深拷贝的原理,还可以帮助我们理解Python内存机制.这篇文章将会通过 ...
- Python赋值语句与深拷贝、浅拷贝的区别
参考:http://stackoverflow.com/questions/17246693/what-exactly-is-the-difference-between-shallow-copy-d ...
- python深拷贝与浅拷贝的区别
可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值 不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象 ...
随机推荐
- Oauth2.0认证
目录 Oauth Oauth2.0 客户端应用注册 授权码模式(authorization code)流程
- [C#] 使用 NAudio 实现音频可视化
预览: 捕捉声卡输出: 实现音频可视化, 第一步就是获得音频采样, 这里我们选择使用计算机正在播放的音频作为采样源进行处理: NAudio 中, 可以借助 WasapiLoopbackCapture ...
- jpa查找数据库最新一条消息
主要字段说明: pid:指导记录主键 user_pid:用户主键 competition_project_pid:用户作品 Mysql表 Repository /** * 指导记录 * @date 2 ...
- python-内置函数-callable,chr,ord,bytes,随机验证码生成
s="老男人" bytes(s,encoding="utf-8") 随机验证码的实现方法: 大写字母: li = [] for i in range(6): t ...
- Pytest自动化测试-简易入门教程(02)
Pytest框架简介 Pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:1.简单灵活,容易上手,支持参数化2.能够支持简单的单元测试和复杂的功能测试,3.还可以用来做sel ...
- springboot使用jwt进行权限验证
springboot使用jwt进行权限验证 依赖准备 首先导入对应的依赖 <dependencies> <dependency> <groupId>org.apac ...
- Windows反调试技术(下)
OD的DBGHELP模块 检测DBGHELP模块,此模块是用来加载调试符号的,所以一般加载此模块的进程的进程就是调试器.绕过方法也很简单,将DBGHELP.DLL改名. #include <Wi ...
- mitmproxy 获取请求响应数据
比较好的一个介绍是:https://blog.wolfogre.com/posts/usage-of-mitmproxy/ mitproxy 获取请求响应数据的代码如下: # -*- coding: ...
- 阅读vue源码-----内置组件篇(keep-alive)
1.前言: <keep-alive>是vue实现的一个内置组件,也就是说vue源码不仅实现了一套组件化的机制,也实现了一些内置组件. <keep-alive>官网介绍如下:&l ...
- micro 从cli的tag中获取配置
官方文档: https://micro.mu/docs/go-config.html https://github.com/micro/go-micro/tree/master/config/sour ...