深浅copy
浅拷贝 只copy了一层 可哈希的变量改变则二者不同 不可哈希变量改变二者都改变
深拷贝 全部都copy了 不论什么值改变 原值都改变呢
变量赋值、浅拷贝、深拷贝
1,创建变量
1.1不可变对象
a = 'hello'
b = 'hello'
print id(a)
print id(b)
执行结果:
>>>
43461664
43461664
>>>
图
结果:a和b的id一样。因为创建b的时候解释器发现b的值是hello,hello是字符串,字符串是不可变对象。hello这个值在内存中已经有了,就不重新开辟内存空间了,所以就把b的引用指向了a的内存空间
1.2可变对象
a = ['hello']
b = ['hello']
print id(a)
print id(b)
内存图:
执行结果:
>>>
43140880
39227920
>>>
结论:a和b的id不一样。因为创建b的时候解释器发现b的值是[hello],[hello]是list,list是可变对象。所以直接开了一个新的内存空间
2,重新赋值
2.1不可变对象的赋值
a = 'hello'
print id(a)
a = 'world'
print id(a)
执行结果:
>>>
41495584
41495648
>>>
内存图:
2.2可变对象的赋值
a = ['hello']
print id(a)
a[0] = 'world'
print id(a)
执行结果:
>>>
42616592
42616592
>>>
内存图:
3,变量对变量的赋值
3.1不可变变量的赋值
a = 'hello'
b = 'hello'
a = b
print id(a)
print id(b)
执行结果:
>>>
41298976
41298976
>>>
3.2可变变量的赋值
a = ['hello']
print id(a)
b = ['hello']
#下面这一行会把b的引用赋值给a,然后把a的内存空间释放,a和b一起用b的内存空间
a = b
print id(a)
print id(b)
执行结果:
>>>
42157840
42157480
42157480
>>>
4,浅拷贝
浅拷贝会把子元素里面的可变元素弄成相同地址
list1 = ['hello',['world']]
list2 = list1[:]
print id(list1),list1
print id(list2),list2
print '-'*30
print id(list1[0]),u'id of list1-hello'
print id(list2[0]),u'id of list2-hello'
print '-'*30
print id(list1[1]),u'id of list1-world'
print id(list2[1]),u'id of list2-world'
执行结果:
40145424 ['hello', ['world']]
44057104 ['hello', ['world']]
------------------------------
43985952 id of list1-hello
43985952 id of list2-hello
------------------------------
44058384 id of list1-world
44058384 id of list2-world
结论:list1和list2地址不同,但是两个list里面的hello和world都相同,说明List是两份,但是里面的内容是1份
5,深拷贝
深拷贝会把子元素里面的可变元素弄成不同地址
5.1深拷贝
from copy import deepcopy
list1 = ['hello',['world']]
list2 = deepcopy(list1)
print id(list1),list1
print id(list2),list2
print '-'*30
print id(list1[0]),u'id of list1-hello'
print id(list2[0]),u'id of list2-hello'
print '-'*30
print id(list1[1]),u'id of list1-world'
print id(list2[1]),u'id of list2-world'
执行结果:
>>>
38900240 ['hello', ['world']]
42811920 ['hello', ['world']]
------------------------------
42740768 id of list1-hello
42740768 id of list2-hello
------------------------------
42813200 id of list1-world
42813760 id of list2-world
>>>
结论:深拷贝会把所有可变对象从新开辟内存空间,包含多层嵌套的可变对象,但是不可变对象还是只有1个地址
5.2深拷贝多加一层嵌套的例子
list1 = ['hello',['world',['abc']]]
list2 = deepcopy(list1)
print id(list1),list1
print id(list2),list2
print '-'*30
print id(list1[0]),u'id of list1-hello'
print id(list2[0]),u'id of list2-hello'
print '-'*30
print id(list1[1][1]),u'id of list1-abc'
print id(list2[1][1]),u'id of list2-abc'
执行结果:
>>>
41894416 ['hello', ['world', ['abc']]]
41908624 ['hello', ['world', ['abc']]]
------------------------------
41823264 id of list1-hello
41823264 id of list2-hello
------------------------------
41895696 id of list1-abc
41896536 id of list2-abc
>>>
深浅copy的更多相关文章
- python基础3(元祖、字典、深浅copy、集合、文件处理)
本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...
- python学习笔记三 深浅copy,扩展数据类型(基础篇)
深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...
- Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数
一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...
- Python 基础之函数、深浅copy,set及练习
三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...
- python基础(三)编码,深浅copy
编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...
- Python 集合 深浅copy
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- 基础数据类型的补充和深浅copy
一:关于str 的操作方法补充 1,s.isspace() 判断字符串是否只由空格组成,是,为True,否则,为False. s = ' ' #只能是以至少一个空格组成的字符串(全空格) prin ...
- python集合深浅copy
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- Python基础数据类型之集合以及其他和深浅copy
一.基础数据类型汇总补充 list 在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索引). 错误示范: lis = [,,, ...
- python之集合,深浅copy
一. 集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
随机推荐
- python---单向循环链表实现
这个判断比较多了. 一次审准,注释作好, 以后就可以照搬这些功能代码了. # coding = utf-8 # 单向循环链表 class Node: def __init__(self, new_da ...
- [转] 微信小程序之生命周期
本篇文章介绍小程序的生命周期,由于小程序分为应用和页面两个部分,所以小程序的生命周期就涉及到三个部分,分别是: 应用的生命周期 页面的生命周期 应用的生命周期对页面生命周期的影响 一.应用的生命周期 ...
- 一起学爬虫——使用xpath库爬取猫眼电影国内票房榜
之前分享了一篇使用requests库爬取豆瓣电影250的文章,今天继续分享使用xpath爬取猫眼电影热播口碑榜 XPATH语法 XPATH(XML Path Language)是一门用于从XML文件中 ...
- AtCoder Grand Contest 027 (AGC017) D - Modulo Matrix 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/AGC027C.html 题解 首先我们假装 max mod min = 1 然后对着这个构造. 将各自黑白染色, ...
- django中models field详解
本文参考自:django官方文档models/field 在model中添加字段的格式一般为: field_name = field_type(**field_options) 一 field o ...
- 在Node.js中使用ffi调用dll
类似的文章还是比较多的,但或多或少有一些问题没有解决,在此我将其整合并分享给大家: 测试环境: Node.js 9.9.0 VisualStudio 2015 "ffi": &qu ...
- js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 for循环
js中return false; jquery中需要这样写:return false(); Jquery 中循环 each的用法 $(".progressName").each(f ...
- (82)Wangdao.com第十六天_JavaScript 异步操作
异步操作 单线程模型 指的是,JavaScript 只在一个线程上运行 也就是说,JavaScript 同时只能执行一个任务,其他任务都必须在后面排队等待 注意,JavaScript 只在一个线程上运 ...
- element 如何自定义主题
自定义主题 在我学习element的时候,就直接忽略了.现在返回来学习一下 ,原来 通过自定义主题可以改变elemnt中默认的一些样式.这样,对于一些不想用elment自带但是用到比较多的样式,可以进 ...
- Web应用程序架构的比较
架构 技术优势 技术挑战 团队优势 团队挑战 单体 低延时 开发简单 没有重复的模型/验证 伸缩 由于代码库过大引起的复杂度 特性内沟通的开销低 失败的恐惧 特性间沟通的开销大 前端+后端 能够单独扩 ...