浅拷贝 只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的更多相关文章

  1. python基础3(元祖、字典、深浅copy、集合、文件处理)

    本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...

  2. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  3. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  4. Python 基础之函数、深浅copy,set及练习

    三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...

  5. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

  6. Python 集合 深浅copy

    一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...

  7. 基础数据类型的补充和深浅copy

    一:关于str 的操作方法补充 1,s.isspace()   判断字符串是否只由空格组成,是,为True,否则,为False. s = ' ' #只能是以至少一个空格组成的字符串(全空格) prin ...

  8. python集合深浅copy

    一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...

  9. Python基础数据类型之集合以及其他和深浅copy

    一.基础数据类型汇总补充 list  在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索引). 错误示范: lis = [,,, ...

  10. python之集合,深浅copy

    一. 集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...

随机推荐

  1. Allegro PCB Design GXL (legacy) 将brd文件另存为低版本文件

    Allegro PCB Design GXL (legacy) version 16.6-2015 参考:https://blog.csdn.net/qq_29761395/article/detai ...

  2. 为什么用Flow

    Flow 是 facebook 出品的 JavaScript 静态类型检查工具.Vue.js 的源码利用了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码. flow的工作方式? ...

  3. pta编程总结3

    7-1 抓老鼠啊~亏了还是赚了? (20 分) 某地老鼠成灾,现悬赏抓老鼠,每抓到一只奖励10元,于是开始跟老鼠斗智斗勇:每天在墙角可选择以下三个操作:放置一个带有一块奶酪的捕鼠夹(T),或者放置一块 ...

  4. codeforces 493 div1 e

    题解: 和这件zhcs的那题有点像 第一种做法是考虑i,i+1之间的贡献 这样子就是矩形加减然后求矩形最小值个数 另一种做法是我们从左向右维护mx-nx-r+l 跟之前那题一样我们知道这个的最小值为0 ...

  5. Beta冲刺4/7

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(4/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 ppt模板 接下来的计划 做好机动. ...

  6. .net core2.x - 关于工作单元(UnitOfWork) 模式

    概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.工作单元(unitofowork)是什么(后面简写uow)? ...

  7. BZOJ4836 [Lydsy1704月赛]二元运算 分治 多项式 FFT

    原文链接http://www.cnblogs.com/zhouzhendong/p/8830036.html 题目传送门 - BZOJ4836 题意 定义二元运算$opt$满足 $$x\ opt\ y ...

  8. 项目sql统计

  9. 习题集1b: 额外练习 (可选)

    1.练习:4.样本特点 用来描述样本的数字叫做? □ 参数   (√)□ 统计量 □ 变量 □ 常数 2.练习:5.大一学生体重情况 Freidman 博士在一所大学任教,她记录了所在大学每位大一新生 ...

  10. django——模型层之单表

    1.ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...