python的深浅拷贝

发布时间:2022-02-17 09:43:58 人气:212 作者:多测师

  1.python中,对象赋值实际是对对象的引用,比如:

  alist=[1,2,[1,2,3]]

  b=alist

  其中,b就是直接引用**ist指向的对象,也就是内存中heap中的一个值,以后这个值发生了什么变化,b和alist就跟着变化

  2.浅拷贝--copy,直接看例子:可以看到,浅拷贝只拷贝父对象,不会拷贝对象内部的子对象。 我不是很理解这句话,其实就是浅拷贝如果

  里面是具体的值,则拷贝的对象不会变化,如果是拷贝的是堆对象,则跟着堆对象的变化而变化?

  l=[1,2,[1,2,3]]

  >>> m=copy.copy(l)

  >>> m

  [1, 2, [1, 2, 3]]

  >>> l[2].append(4)

  >>> l

  [1, 2, [1, 2, 3, 4]]

  >>> m

  [1, 2, [1, 2, 3, 4]]

  >>> l[0]=100

  >>> l

  [100, 2, [1, 2, 3, 4]]

  >>> m

  [1, 2, [1, 2, 3, 4]]

  现在依次把m,l中的值地址打印出来:

  [id(x) for x in m]

  [35289464L, 35289440L, 55546952L]

  >>> [id(x) for x in l]

  [35291072L, 35289440L, 55546952L]

  可以看到末端的列表元素指向的是同一个地址,所以这个地址里的东西发生变化了,就都会变化呀

python的深浅拷贝

  再举一例:

  >>> l=[1,2,{'age':90}]

  >>> l

  [1, 2, {'age': 90}]

  >>> m=copy.copy(l)

  >>> m

  [1, 2, {'age': 90}]

  >>> [id(x) for x in l]

  [35289464L, 35289440L, 55566680L]

  >>> [id(x) for x in m]

  [35289464L, 35289440L, 55566680L]

  >>> l[2]=[1,2]

  >>> l

  [1, 2, [1, 2]]

  >>> m

  [1, 2, {'age': 90}]

  >>> [id(x) for x in l]

  [35289464L, 35289440L, 55548552L]

  3.深拷贝:直接就是拷贝了对象本身,即堆内存中的那一坨,那你原来那一坨的改变就不能影响深拷贝的元素的变化了

  >>> mimi=['mimi',['age',30]]

  >>> kiki=copy.deepcopy(mimi)

  >>> bibi=copy.deepcopy(mimi)

  >>> print id(mimi),id(kiki),id(bibi)

  55575496 55547336 55546248

  >>> kiki

  ['mimi', ['age', 30]]

  >>> bibi

  ['mimi', ['age', 30]]

  >>> kiki[0]='kiki'

  >>> bibi[0]='bibi'

  >>> print mimi,kiki,bibi

  ['mimi', ['age', 30]] ['kiki', ['age', 30]] ['bibi', ['age', 30]]

  >>> kiki[1][1]=31

  >>> kiki

  ['kiki', ['age', 31]]

  >>> bibi[1][1]=32

  >>> print mimi,kiki,bibi

  ['mimi', ['age', 30]] ['kiki', ['age', 31]] ['bibi', ['age', 32]]

  >>> [id(x) for x in mimi]

  [53922472L, 55631304L]

  >>> [id(x) for x in mimi]

  [53922472L, 55631304L]

  >>> [id(x) for x in kiki]

  [56337952L, 55546760L]

  >>> [id(x) for x in bibi]

  [53923752L, 55600264L]

  从例子看出,深拷贝就不会列表中的列表发生一起改变的事情,

  总结一下:

  1.利用切片和工厂方法,copy方法进行的拷贝都是浅拷贝,就是拷贝的是原有对象的地址,在这个地址上发生的改变之后都被记下来,

  切片复制:

  p=[1,2,3]

  t=p[:]

  工厂方法:

  t=list(p)

  copy方法:

  t=copy.copy(p)

  2.利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。就是把所有的值复制了一遍,

  原有地址的变化和拷贝发生后的对象毫无关联

  注意的是:对于数字,字符串,其他原子类型的对象来说,没有拷贝的说法,原子类型对象:个人感觉就是存放在栈中的对象, 顾名思义

  就是不可再分割,或是组成其它数据类型的元元素。python来说就是数字,字符串

  以上内容为大家介绍了python的深浅拷贝,希望对大家有所帮助,如果想要了解更多Python相关知识,请关注多测师。https://www.e70w.com/xwzx/

返回列表
在线客服
联系方式

热线电话

17727591462

上班时间

周一到周五

二维码
线