zoukankan      html  css  js  c++  java
  • python中深复制和浅复制区别

    在python中,对象赋值实际上是对象的的引用,当创建一个对象,然后把它赋值给另外一个变量的时候,python没有拷贝这个对象,而只是拷贝了这个对象的引用,多以就出现了浅复制,即复制后原对象改变后,复制出来的对象也会改变,要防止复制出来的对象改变,就要使用深复制

    python复制三种方式

    (1)直接赋值,传递对象的引用而已。原始列表改变,被赋值的对象也会做相同改变

    1 list1 = [1,2,'a',[4,'ss']]
    2 list2 = list1
    3 print(list2)  #result;[1, 2, 'a', [4, 'ss']]
    4 print(list3)
    5 list1.append(10)
    6 print(list1,list2)  #[1, 2, 'a', [4, 'ss'], 10] [1, 2, 'a', [4, 'ss'], 10]

    (2)copy浅复制,没有拷贝子对象,所以原始数据改变,子对象也会发生变化

      注:copy浅复制与list[:]效果一致

    1 list1 = [1,2,'a',[4,'ss']]
    2 import copy
    3 list2 = copy.copy(list1)
    4 print(list2)  #[1, 2, 'a', [4, 'ss']]
    5 list1.append('c')
    6 print(list1,list2)  #[1, 2, 'a', [4, 'ss'], 'c'] [1, 2, 'a', [4, 'ss']]
    7 list1[3].append(5)
    8 print(list1,list2)  #里面的子对象被改变了[1, 2, 'a', [4, 'ss', 5], 'c'] [1, 2, 'a', [4, 'ss', 5]]

    (3)深拷贝,包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变

    1 list1 = [1,2,'a',[4,'ss']]
    2 import copy
    3 list2 = copy.deepcopy(list1)
    4 print(list2)  #[1, 2, 'a', [4, 'ss']]
    5 list1.append('c')
    6 print(list1,list2)  #list2始终没有变[1, 2, 'a', [4, 'ss'], 'c'] [1, 2, 'a', [4, 'ss']]
    7 list1[3].append(5)
    8 print(list1,list2)  #list2始终没有变[1, 2, 'a', [4, 'ss', 5], 'c'] [1, 2, 'a', [4, 'ss']]
  • 相关阅读:
    npm 插件发布和使用
    git 配置与删除远程地址
    elment 编辑输出行数据后,过滤下拉,值必须全等于下拉值
    后台 接口 传值 不同类型的详细解说
    Vue vscode调试
    vue 标题和输入框分两行,调成一行
    ES6 学习笔记(持续更新中)
    vue开发WebApp 开发笔记(持续更新)
    移动端自适应方案 对应设计图制作
    css 颜色使用预览 码表
  • 原文地址:https://www.cnblogs.com/pinpin/p/9865228.html
Copyright © 2011-2022 走看看