python 深、浅拷贝
Python的数据结构总体分为两类:
1、字符串和数字
2、列表、元组、字典等
一、字符串和数字
对于字符串和数字而言,赋值(=)、浅拷贝(copy)和深拷贝(deepcopy)其实都没有意义,因为它们都永远指向同一个内存地址。
>>> import copy
>>> a1 = 100
>>> id(a1)
1426656816 # a1的内存地址 # 赋值
>>> a2 = a1
>>> id(a2)
1426656816 # 浅拷贝
>>> a3 = copy.copy(a1)
>>> id(a3)
1426656816 # 深拷贝
>>> a4 = copy.deepcopy(a1)
>>> id(a4)
1426656816
如图:
二、列表、元组、字典等
对于列表、字典而言,进行赋值(=)、浅拷贝(copy)和深拷贝(deepcopy),其引起的变化是不一样的。
2.1、赋值(=)
names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = names
names[1] = "Pear"
print(names)
print(name2)
print("-----------------")
names[3][1] = "Dog"
print(names)
print(name2)
print(id(names))
print(id(name2)) # 输出
['Angle', 'Pear', 'Athena', ['Banana', 'apple']]
['Angle', 'Pear', 'Athena', ['Banana', 'apple']]
-----------------
['Angle', 'Pear', 'Athena', ['Banana', 'Dog']]
['Angle', 'Pear', 'Athena', ['Banana', 'Dog']]
1504387406536
1504387406536 # 可以看到names 的每一次变化,name2也会改变,因为他们的内存地址是一样的
如图:
这和字符串和数字是不一样的,当我们定义 a =1 ,b = a ,改变a时,b是不会有变化的。列表和字典等会跟着变化,因为他们的内存地址是一样的。
a = 1
b = a
a = 100
print(a)
print(b) # 输出 100
1
2.2、浅拷贝(copy)
import copy names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = copy.copy(names)
names[1] = "宙斯"
print(names, "names的内存地址是{}".format(id(names)))
print(name2, "name2的内存地址是{}".format(id(name2))) #输出
['Angle', '宙斯', 'Athena', ['Banana', 'apple']] names的内存地址是1764417452744
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] name2的内存地址是1764416035080 我们浅copy了一个name2,同时我们将names中的Zous的值改为中文,但是name2的没有改变。因为他们的内存地址是不一样的,改变其中一个不影响另外一个。
我们接下来看:
import copy names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = copy.copy(names)
names[1] = "宙斯"
print(names, "names的内存地址是{}".format(id(names)))
print(name2, "name2的内存地址是{}".format(id(name2))) names[3][1] = '苹果'
print(names, id(names[3]))
print(name2, id(name2[3])) # 输出
['Angle', '宙斯', 'Athena', ['Banana', 'apple']] names的内存地址是2306153560776
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] name2的内存地址是2306152155528
['Angle', '宙斯', 'Athena', ['Banana', '苹果']] 2306153648968
['Angle', 'Zous', 'Athena', ['Banana', '苹果']] 2306153648968 # 这次我们不仅改变了最外层的列表的值,还改变了列表中一个列表的值。
# 这次的结果是 里层的列表跟着做了改变
我们通过打印的内存地址可以明显看出,整个外层列表的内存地址是不一样的,但是里层的列表内存地址是一致的。
如图:
总结:浅拷贝(copy.copy(x))只是将列表等数据类型的第一层copy了一下,内存地址改变了。但是对于里层的数据类型的内存地址没有改变。
2.3、深拷贝(deepcopy)
深拷贝(copy.deepcopy(x))其实就是重新开辟了一个新的内存地址,存储deepcopy后的数据,和原来数据的内存地址完全不一样了,包括里层数据类型的内存地址。
import copy names = ['Angle', 'Zous', 'Athena', ['Banana', 'apple']]
name2 = copy.deepcopy(names)
names[1] = "宙斯"
print(names, "names的内存地址是{}".format(id(names)))
print(name2, "name2的内存地址是{}".format(id(name2))) names[3][1] = '苹果'
print(names, id(names[3]))
print(name2, id(name2[3])) #输出
['Angle', '宙斯', 'Athena', ['Banana', 'apple']] names的内存地址是2379824216776
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] name2的内存地址是2379824217160
['Angle', '宙斯', 'Athena', ['Banana', '苹果']] 2379824304968
['Angle', 'Zous', 'Athena', ['Banana', 'apple']] 2379824305032 #可以看出,names不论是改变外层还是里层列表的数据,都不会影响到name2。
如图:
python 深、浅拷贝的更多相关文章
- Python深复制浅复制or深拷贝浅拷贝
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象.(比深拷贝更加节省内存)2. copy.deepcopy 深拷贝 拷贝对象及其子对象 用一个简单的例子说明如下: >& ...
- iOS 浅谈:深.浅拷贝与copy.strong
深.浅拷贝 copy mutableCopy NSString NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSString *copyStri ...
- 【转】iOS 浅谈:深.浅拷贝与copy.strong
深.浅拷贝 copy mutableCopy NSString 1 2 3 4 5 6 NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSStri ...
- 深度解析:python之浅拷贝与深拷贝
深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...
- c++深/浅拷贝 && 构造函数析构函数调用顺序练习题
1.深/浅拷贝 编译器为我们提供的合成拷贝构造函数以及合成的拷贝赋值运算符都是浅拷贝.浅拷贝只是做简单的复制,如果在类的构造函数中new出了内存,浅拷贝只会简单的复制一份指向该内存的指针,而不会再开辟 ...
- 一入python深似海--浅拷贝与深拷贝
python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝. 要理解浅拷贝,必须先弄清楚python中的引用. 引用 Python中一切都是对象,变量中存放的是对象的引用 ...
- python深、浅拷贝
1.首先对于数字和字符串而言,深浅拷贝无实际意义,两者同时指向同一个内存地址. a = 123 print(id(a)) b = a print(id(b)) 495849744 495849744 ...
- Python的浅拷贝与深拷贝
定义: =号浅拷贝:在Python中对象的赋值其实就是对象的引用.copy了之后两个仍然是同一个东西.那么他们内部的元素自然也是一样的,对其中一个进行修改,另一个也会跟着变> copy()浅拷贝 ...
- python之浅拷贝和深拷贝
1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...
随机推荐
- jquery选择器 直观实验
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Is It A Tree?(并查集)
Description A tree is a well-known data structure that is either empty (null, void, nothing) or is a ...
- 《Linux内核分析》学习总结与学习心得
一.目录列表 第一周:计算机是如何工作的? http://www.cnblogs.com/dvew/p/5224866.html 第二周:操作系统是如何工作的? http://www.cnblogs. ...
- Python:三元运算
result=值1 if 条件 else 值2 如果条件为真,result=值1 如果条件为假,result=值2 例子: a,b,c=1,3,5 d=a if a>b else c print ...
- Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素到列表的头部(左边)或者尾部(右边),一个列表最多可以包含2^32-1个元素(4294967295,每个列表超过40亿个元素). ...
- Scrum Meeting Beta - 4
Scrum Meeting Beta - 4 NewTeam 2017/12/2 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 完成了部分页面标题栏颜色的修改和字体的调整Iss ...
- PAT 甲级 1008 Elevator
https://pintia.cn/problem-sets/994805342720868352/problems/994805511923286016 The highest building i ...
- 第100天:CSS3中animation动画详解
CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation: 一.Animation定义动画 CSS3的Animation是由“keyframes”这个属性来 ...
- hadoop跑第一个实例过程
第一次跑hadoop实例,中间经过了不少弯路,特此记录下来: 第一步:建立一个maven过程,pom.xml文件:(打包为jar包) <dependency> <groupId> ...
- Android 分Dex (MultiDex)
需要分Dex的理由想必大家都知道了.正是在ART以前的Android系统中,Dex文件对于方法索引是用一个short类型的数据来存放的.而short的最大值是65535,因此当项目足够大包含方法数目足 ...