当前位置:   article > 正文

Python 基础| Python 直接赋值、深拷贝和浅拷贝_python深拷贝、浅拷贝、赋值

python深拷贝、浅拷贝、赋值

先看这三个词的意思我觉得菜鸟的总结就很好 Python 直接赋值、浅拷贝和深度拷贝 | 菜鸟教程

  • 直接赋值:其实就是对象的引用(别名)。

  • 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。

  • 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。

有一天我遇到这样一个问题,大概是这样给一个list变成list[dict](就是list的每个值加一个描述字段的key)。

  1. a=['a','b','c','d']
  2. b={}
  3. c=[]
  4. for i in a:
  5. b["info"]=i
  6. c.append(b)
  7. print(c)

我们看一下程序的逻辑,for循环a,然后b是一个字典,那么b每次被赋值然后被append到 c这个list里,按照预想 c应该打印出 

[{'info': 'a'}, {'info': 'b'}, {'info': 'c'}, {'info': 'd'}]

但是并没有,运行下面的程序会得到

 [{'info': 'd'}, {'info': 'd'}, {'info': 'd'}, {'info': 'd'}]

这是为什么呢,先说怎么解决这个问题,我们引入拷贝这个概念,把代码改成这样,就得到了我们想要的

  1. a=['a','b','c','d']
  2. b={}
  3. c=[]
  4. for i in a:
  5. b["info"]=i
  6. f = b.copy()
  7. c.append(f)
  8. print(c)

[{'info': 'a'}, {'info': 'b'}, {'info': 'c'}, {'info': 'd'}]

因为XXX.copy()这个函数是浅拷贝,浅拷贝就是重新分配一块内存创建一个新的对象,但里面的元素是原对象中各个子对象的引用

相较于普通的赋值,浅拷贝会将两个变量分别放在不同的内存地址,解决了直接赋值的缺点

但是如果我们这个数据结构不是一层的怎么办呢,那就要用到深拷贝。copy.deepcopy() 

深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,新对象和原对象没有任何关联

使用方法:

  1. #直接赋值
  2. a=1
  3. b=a #它俩内存地址是一样的
  4. #浅拷贝
  5. a={'a':[1,2,3]}
  6. b=a.copy()
  7. #他两地址不一样了 但是[1,2,3]是同一个
  8. #深拷贝
  9. a={'a':[1,2,3]}
  10. b=copy.deepcopy(a)
  11. #这是两个完全独立的东西了

用图直观的描述三者的区别

直接赋值

浅拷贝

 

深拷贝:

 

 

所以在写python程序的时候,遇到复杂的数据结构,要考虑该用深拷贝还是用等号赋值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/71466
推荐阅读
相关标签
  

闽ICP备14008679号