科技资讯眺望|Python笔记11_深拷贝浅拷贝

主要内容:

  • 小目标:掌握对象拷贝
  • 主要内容:拷贝引发问题 , 问题分析 , 拷贝问题避免方式
如果看完这篇文章 , 你还是弄不明白拷贝问题; 你来找我 , 我保证不打你 , 我给你发100的大红包 。
1. 几个例子1.1 理解引用a = 10b = aa = 20print(a, b)问题:a , b的值分别为? 结果:20 10 为什么?
  • 数字是一种不可变数据结构 ,
  • ab的赋值在Python中称作引用 , 每个变量名对应一个对象;
  • b = a , 之后 , a与b都指向10这个对象
  • a = 20之后 , a指向20 , b没有变化
  • 可以通过id(x)看变量地址;
1.2 列表创建与修改问题p1 = [[1,2,3],4]#p2为创建的新列表p2 = list(p1)#p1第一个元素为子列表 , 对子列表第一个元素进行修改p1[0][0] = 10#p2对对1个元素修改p2[1] = 100print(p1, p2)问题:p1 , p2的值分别为?
结果:[[10, 2, 3], 4] [[10, 2, 3], 100]
问题:为什么p1,p2中子列表的值一样 , 但是第二个元素值不一样 ;
分析:
1. p2 = list(p1) , 创建新列表 , 但是 , p1的元素没有改变 , p1,p2如下
科技资讯眺望|Python笔记11_深拷贝浅拷贝
修改后的结果:
对p1[0][0]进行修改 , 对v1的子列表进行修改 ,
但是p1,p2没有变化对p2[1]修改 ,
因为p2[1]为不可变数据结构 , 所以p2[1]发生变化 , p1不变
科技资讯眺望|Python笔记11_深拷贝浅拷贝
  • p2 = list(p1)这个操作就是一个浅拷贝
2. 浅拷贝与深拷贝Python中可以使用copy模块进行拷贝
import copy
  • copy.copy:浅拷贝 , 只对当前对象进行拷贝 , 没有对子元素进行拷贝
  • copy.deepcopy:深拷贝 , 对象及其子对象
看一个例子:
import copyp1 = [[1,2],4]p2 = copy.copy(p1)p3 = copy.deepcopy(p1)#先来看地址:print('%x %x %x'%(id(p1),id(p2),id(p3)))#在来看第一个元素地址:print('%x %x %x'%(id(p1[0]),id(p2[0]),id(p3[0])))#对子列表修改p1[0][0] = 10p2[1] = -1p3[0][1] = 100print('p1:',p1)print('p2:',p2)print('p3:',p3)可以看到:
p1与p2的第一个元素:列表 , 是一个对象 , 对其修改会影响p1,p2p1,p2与p3的第一个元素不是同一个元素 , 所以修改对p3不会有影响p1,p2,p3中的第二个元素为数字 , 所以修改任意一个 , 不会对其他造成影响
  • 问题实质:
【科技资讯眺望|Python笔记11_深拷贝浅拷贝】迭代对象中的元素是否可变(列表 , 字典等) , 可变就使用深拷贝 , 浅拷贝操作:copy.copy , list, dict等3. 可变与不可变:
  • 元组可变:元组的元素为列表 , 例如:([1,2,3],3,[5])
总结:
  • 拷贝问题 , 主要对列表字典等可变对象操作引发 ,
  • 如果对列表字典进行拷贝 , 推荐使用深拷贝;


    推荐阅读