python中的深拷贝,python中的深拷贝和浅拷贝

  python中的深拷贝,python中的深拷贝和浅拷贝

  1.变量存储变量的存储分为栈区和堆区,两者之间有引用关系。变量名存储在堆栈区内存中,实际数据存储在堆内存中。

  堆栈区通过指针指向对应的堆区内存。

  二、直接赋值链赋值直接引用堆栈区的变量名,相当于一个人给两个名字,代表同一个对象。

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

  l1=l

  Print (ID (L),ID (L1)) # 43418120 43418120两个列表是相同的

  3.浅拷贝浅拷贝只拷贝指向堆区的指针,而不是对象本身。新旧对象仍然共享相同的内存。

  对于不可变类型,它指向真实数据,对于可变类型,它指向对象的堆栈区域。

  改变实体中不可变类型的本质是实体重新申请内存改变其指针,不改变原内存,不影响副本的指针指向,副本对应的元素保持不变。

  改变真实体中的可变类型,副本对应的元素也会随之改变。

  导入副本

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

  L1=copy.copy(l) #一份

  Print(id(l),id(l1)) #656 936浅拷贝不带来原对象,而是创建一个新对象。

  print(id(l[0]),id(l[1]),id(l[2])),)#224 256 928

  Print (ID (L1 [0]),ID (L1 [1]),ID(L1[2]))# 224 256 928轻拷贝指的是与原拷贝相同的内存块。

  l[0]=222

  print(l,l1) #[222,2,[1,2]] [1,2,[1,2]]

  Print (id (L [0]),id (L [1]),ID (L [2]),# 296 256 928改变一个不可变类型的值就是在堆区重新申请一块内存,ID就变了。

  print(id(l1[0]),id(l1[1]),id(l1[2]),)#224 256 928

  l[2]。追加(666)

  print(l,l1) #[222,2,[1,2,666]] [1,2,[1,2,666]]

  Print (id (L [0]),id (L [1]),ID (L [2]),# 296 256 928改变可变类型,其ID保持不变(可变类型是堆区内的一个栈区,改变类似于链表本身的链式赋值。别名,可以细化)

  打印(ID (L1 [0]),ID (L1 [1]),ID (L1 [2]),# 224 256 928 IV。无论深度副本是可变的还是不可变的,都是指向真实的数据,所以无论真实的怎么变,副本都是不变的。

  副本id不同,但有时id相同是违背常识的,这是小整数池造成的。

  导入副本

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

  L1=copy.deepcopy(l) #一个副本

  Print(id(l),id(l1)) #656 936 Deep copy不复制原对象,而是创建一个新对象。

  print(id(l[0]),id(l[1]),id(l[2]),id(l[2][0]),id(l[2][1])# 224 256 296 224 256

  Print (ID (L1 [0])、ID (L1 [1])、ID (L1 [2])、ID (L1 [2] [0])、ID(L1[2][1])# 224 256 632 224 256五、值传递和引用传递python基础

  在passl-by-value的过程中,被调用函数的形参被当作被调用函数的局部变量,即在堆栈中开辟一个内存空间来存储调用函数放入的实参的值,从而成为实参的副本。值传递的特点是调优函数对形参的任何操作都是作为局部变量进行的,不会影响主调优函数的自变量变量值。

  在按引用传递的过程中,虽然被调用函数的形参也作为局部变量在栈中开辟内存空间,但此时存储的是调用函数放入的实际实参的地址。被调用函数对参数的任何操作都被视为间接寻址,即通过堆栈中存储的地址访问主调用函数中的自变量变量。正因为如此,调优函数对参数的任何操作都会影响主调优函数中的自变量变量。

  不变的参数是值类型,传递的值有:数字、字符串、元组。

  变量参数,引用传递,传递后可以修改的内存,比如list,dictionary。

  Ps:要特别注意不可变类型的坑:

  Task={test :真他妈的疯狂 }

  waiting_recog={}

  recoging _ tasks={ }

  task[ num _ recogging ]=0

  对于范围(2)中的I:

  num=i

  waiting_recog[num]=任务

  任务[数量重新记录]=1

  recogging _ tasks[ task _ id ]=任务

  打印(等待_记录)

  打印(重新计费_任务)

  {0: {test: just TM是离谱, num _ recogging :2 },1: {test: just TM是离谱, num _ recogging :2 } }

  {task_id: {test :就TM离谱, num _ recogging :2 } }

  # # # #实际应用示例

  转载请联系作者授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: