前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python|赋值、浅拷贝与深拷贝

Python|赋值、浅拷贝与深拷贝

作者头像
算法与编程之美
发布2019-07-17 16:19:12
6680
发布2019-07-17 16:19:12
举报

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

赋值

在python中一个变量可以说是内存中一个对象的‘标签’或者‘引用’。假设现在有一个变量a。

a=1

a是指向了内存中的一个int型对象,a相当于一个指向该对象的标签,如果给a重新赋值:a=7

那么a将会移动,指向另一个int型对象。原来的对象a当没有任何标签或者引用指向它时,会被自动释放。

所以在python中,变量不用定义类型,也可以说是没有类型,类型是属于对象的而不是变量的,这就和java、c、c++等语言有很大的不同,在这些语言中要先声明变量类型,并且指定类型的变量只能放入该类型的内容。

因此,在python中,对对象的赋值都是对象的引用地址的传递(变量传递是传引用而不是传值)。

b=1a=ba is b #返回True

a和b都指向同一个内存地址,反过来说该内存地址有两个标签,修改其中一个的变量的值将会引起另一个变量值的变化。

浅拷贝与深拷贝

先从概念上来区分浅拷贝与深拷贝。

浅拷贝与上文的赋值相似,只是换了一个标签(引用)(指向同一个内存地址),而不会重新开辟一个内存地址来存放相同的值,改变其中一个对象的值会引起另一个对象的值的变化。

深拷贝则是换一个标签(引用)并重新开辟一块内存来存放相同的值,因此内存地址也会改变,改变其中一个对象的值不会对另一个对象的值产生影响。

注意:在python中,浅拷贝与深拷贝的不同仅仅是对组合对象而言,所谓的组合对象就是指包含其他对象的对象,比如列表、类等。而对于数字,字符串以及其他‘原子’类型,没有拷贝一说,产生的都是原对象的引用。

a=”abc”b=copy.deepcopy(a) #深拷贝a is b #返回True

下面通过组合对象来看看深拷贝与浅拷贝的区别

#浅拷贝import copya=[11,’abc’,[‘python’,’nice’]]b=copy.copy(a) #浅拷贝a is b #返回Falseprint ( id (a) , id (b) ) #返回a、b内存地址,不相同a[0] is b[0] #返回Trueprint ( id (a[0]) , id (b[0]) ) #返回a[0]、b[0]内存地址,相同

浅拷贝会创造一个新的对象,上述例子中“a is not b”。但是对于对象中的元素,则使用元素的引用,也就是“a[i] is b[i]”。

a[0]=51b[0] is a[0] #返回Falsea[1]=”py”b[1] is a[1] #返回Falsea[2].append('yes')a[2] is b[2] #返回True

由于该对象中的第一个元素和第二个元素都是不可变类型,当修改不可变类型时会产生新的对象并使用一个新的内存地址,而b仍然指向未修改前的地址,所以会返回False。第三个元素是可变类型,修改操作不会产生新的对象,所以a的变化会引起b的变化。

常见的浅拷贝操作:切片操作、工厂函数(如list/dir/set)、copy函数。

#深拷贝import copya=[11,’abc’,[‘python’,’nice’]]b=copy.deepcopy(a) #深拷贝a is b #返回Falsea[0] is b[0] #返回Falseprint ( id (a) , id (b) ) #返回a、b内存地址,不相同print ( id (a[0]) , id (b[0]) ) #返回a[0]、b[0]内存地址,不相同

跟浅拷贝类似会创造一个新的对象,所以a is not b。但是对于其中的元素,深拷贝都会生成一份相同的,并使用不同的内存地址储存,所以a[0] is not b[0]。

END

主 编 | 张祯悦

责 编 | 马原涛

where2go 团队

微信号:算法与编程之美

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档