zoukankan      html  css  js  c++  java
  • python使用笔记25--深拷贝、浅拷贝

    1、循环删除list

    1 ll = [1,1,32,4,3,2,3,2,4,6,4,5,6,7,8]
    2 for i in ll:
    3     if i % 2 !=0:
    4         ll.remove(i)
    5 print(ll)

    执行结果如下:

    该段代码有问题,循环删除list,会导致下标错乱

    解决办法1,代码如下:

    1 import copy
    2 
    3 ll = [1,1,32,4,3,2,3,2,4,6,4,5,6,7,8]
    4 ll2 = copy.deepcopy(ll)#深拷贝
    5 for i in ll2:
    6     if i % 2 !=0:
    7         ll.remove(i)
    8 print(ll)

    执行结果如图所示:

    2、深拷贝、浅拷贝

    深拷贝是指的拷贝之后,操作不影响原有变量

    浅拷贝是指拷贝之后,对新的变量进行操作会影响原有变量

    copy出来之后,如果内存地址不变,肯定是浅拷贝
    copy.deepcopy 肯定是深拷贝,而且只有这一种是深拷贝
    copy.copy()
    list.copy()
    dict.copy()这三种可能地址不一样,但是也是浅拷贝

     1 a = [1, 32, 4, 3, 2, 3, 2, 4, 6, 4, 5, 6, 7, 8, {'key1': 'value1'}]
     2 a1 = a #浅拷贝
     3 
     4 a2 = copy.deepcopy(a)#深拷贝
     5 
     6 a3 = a.copy()#浅拷贝
     7 
     8 a4 = copy.copy(a)#浅拷贝
     9 
    10 a.pop(1)
    11 a[-1]['key1'] = 'xiaoxiaolin'
    12 
    13 print(id(a),a)
    14 print(id(a1),a1)
    15 print(id(a2),a2)
    16 print(id(a3),a3)
    17 print(id(a4),a4)

    执行结果如图所示:

     a和a1内存地址一样,肯定是浅拷贝

    a和a2内存地址不一样,且操作a对a2没有影响,是深拷贝

    a和a3,a4内存地址不一样,但是深层次的操作a,对a3,a4有影响,是浅拷贝

  • 相关阅读:
    JSON解析之——Android
    Xml解析之——Java/Android/Python
    Design Pattern —— Singleton
    设计模式(10)--观察者模式
    设计模式(9)--建造者模式
    设计模式(8)--外观模式
    设计模式(7)--模板模式
    设计模式(6)--原型模式
    设计模式(5)--工厂模式
    设计模式(4)--代理模式
  • 原文地址:https://www.cnblogs.com/cjxxl1213/p/13121749.html
Copyright © 2011-2022 走看看