上海Python培训
达内上海Python培训中心

15026646813

热门课程

上海Python培训:赋值与浅拷贝/深拷贝之间的区别

  • 时间:2018-03-16 12:03
  • 发布:上海python培训
  • 来源:Python问答

基础部分的python知识不够透彻,很容易被面试中的小坑洼给hold住了,比如赋值与浅拷贝/深拷贝之间的区别,你都有了解吗?-上海Python培训

上海Python培训

上海Python培训小编首先来一段代码举例:

>>> a=[1,2,3,4]

#变量=值

>>> b=a

>>> b is a and a is b

True

>>> b == a

True

>>> id(b),id(a)

(140139217122656, 140139217122656)

Python中的赋值

这里解释下赋值的意思:值是已经存在的,赋给哪个变量此变量就带上(指向)了这份值,可有多个变量指向一份值;针对这份值的修改会反映到任何一个变量上去(深层次可以通过id()函数来验证);赋值也是传递对象的引用,原始列表name改变,被赋值的n也会做相同的改变。

浅拷贝和深拷贝的不同仅仅是对组合对象来说,而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。

Python中的浅拷贝

所谓“浅拷贝”,是指创建一个新的对象,其内容是原对象中元素的引用。(拷贝组合对象,不拷贝子对象),换句话说浅拷贝就是拷贝父对象,不会拷贝对象的内部子对象。即拷贝列表name里面的一级元素的内存地址,不拷贝name里的小列表里的元素的内存地址。

上海Python培训小编列举几种常见的浅拷贝:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。

>>> import copy

>>> b=copy.copy(a)

>>> b==a

True

>>> b is a

False

>>> a[0] = 'aaa'

>>> b

[1, 2, 3, 4]

>>> a

['aaa', 2, 3, 4]

>>> b[0]='bbbb'

>>> b

['bbbb', 2, 3, 4]

>>> a

['aaa', 2, 3, 4]

>>> id(b),id(a)

(140139217122656, 140139217122629)#id不同,但是看下边

>>> id(b[2]),id(a[2])

(32484408,32484408)#子条目的id是相同的。

从上面上海Python培训所举的例子可以明显的看出来,b 浅拷贝得到 a,a 和 b 指向内存中不同的 list 对象,但它们的元素却指向相同的对象。

Python中的深拷贝

所谓“深拷贝”,是指创建一个新的对象,然后递归的拷贝原对象所包含的子对象。深拷贝出来的对象与原对象没有任何关联。上海Python培训:深拷贝中copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。即name2不仅拷贝了name中一级元素(1,2,3,["alex","rain"])的内存地址,也拷贝了嵌套列表,["alex","rain"]里面的"alex"和"rain"的内存地址。

如果子对象是不可变对象,则结果和上边的基本一致,但是实际上 a 和 b 是相互独立的,这是因为对于不可变对象,当需要一个新的对象时,python可能会返回已经存在的某个类型和值都一致的对象的引用

当子对象是可变对象的时候情况就会很明了了

>>> a=[[1,3],[4,6]]

>>> b=a

>>> a[[1, 3], [4, 6]]

>>> b[[1, 3], [4, 6]]

>>> b=copy.copy(a)

>>> b == a

True

>>> b is a

False

>>> b[0] is a[0]

True

>>> b = copy.deepcopy(a)

>>> b[0] is a[0]

False

>>>

上一篇:我没学过编程,能否学会Python?
下一篇:Python语言的这些设计风格

上海好的Python培训机构?如何选择一家比较好的Python培训机构呢?

上海python培训去哪里学习?零基础python如何学习?

上海python培训机构排名?如何选择一家好的python培训机构?

什么是Python函数式编程?

选择城市和中心
贵州省

广西省

海南省

免费学习5天VIP课程